将列数组传递到UDF时过滤出Null列-Spark SQL

时间:2018-10-10 09:37:43

标签: scala apache-spark apache-spark-sql

我具有此功能:

def funcToUDF(fieldValues: Seq[Double]): Double =
  fieldValues.reduce(aggFunc)

从中创建UDF:

def uDFToApply = udf(funcToUDF(_: Seq[Double]))

然后我想应用此udf向我的DataFrame添加新列:

val valueFieldsToCol = valueFields.map(col) //valueFields is a List[String] containing the fields to operate on
val isNotNull = valueFieldsToCol.map(_.isNotNull).reduce(_ || _)
val createArray = array(valueFieldsToCol : _*)

val dfWithOutput = df.withColumn(output, when(isNotNull, 
uDFToApply(createArray)).otherwise(lit(None.orNull)))

我这里遇到的问题是,当我在when方法中应用UDFToApply时,我正在传递可以具有空值的列。应用UDF时,我的aggFunc可以是math.min,并且在转换为Double时将null字段转换为0.0。

尽管我可以为这个问题提供两种解决方案:

1-使udfs不要将null值强制转换为0.0,但不能使之起作用。

2-将null列传递给UDF时将其过滤掉,我也做不到。尝试使用isNotNull创建array,但是UDF应该使用boolean类型而不是Double

对此有何想法?

0 个答案:

没有答案