我在scala中使用spark(2.4)。我有一个数组,我试图用default值(空数组)替换空值(数组列)。
val emptyStringArray = udf(() => Array.empty[String],
DataTypes.createArrayType(DataTypes.StringType, false))
def ensureNonNullCol: DataFrame => DataFrame = inputDf => {
inputDf.select(inputDf.schema.fields.map { f: StructField =>
f.dataType match {
case array: ArrayType => new Column(
AssertNotNull(when(col(f.name).isNull,
array.elementType match {
case DataTypes.StringType => emptyStringArray()
}).otherwise(col(f.name)).expr)
).as(f.name)
}
}: _*)
}
最后,我得到:
|-- StrAarrayColumn: array (nullable = false)
| |-- element: string (containsNull = true)
我怎么能有:
|-- StrAarrayColumn: array (nullable = false)
| |-- element: string (containsNull = false)
?
1条答案
按热度按时间yshpjwxd1#
问题是,你的第一个框架有一个结构体,它包含一个可能包含null的字符串数组。现在你的
ensureNonNullCol
函数接收到一个带有一些结构体的输入框架,你只需要选择一些值,不改变你的框架的结构体,只需要返回它。在我开始解决方案之前,你的代码有3个要点。无论如何,解决方案是在选择函数中所需的字段后也更新结构类型: