在Spark中如何使用UDO作为参数调用UDF以避免二进制错误

时间:2018-07-13 07:54:12

标签: apache-spark apache-spark-sql

我用UDO作为参数定义了一个UDF。但是,当我尝试在数据框中调用它时,出现错误消息“ org.apache.spark.SparkException:无法执行用户定义的函数($ anonfun $ 1 :(数组)=> int)”。只想知道该异常将UDO提到为二进制文件,并且该如何解决?

val logCount = (logs: util.List[LogRecord]) => logs.size()
val logCountUdf = udf(logCount)
// The column 'LogRecords' is the agg function collect_list of UDO LogRecord
df.withColumn("LogCount", logCountUdf($"LogRecords"))

1 个答案:

答案 0 :(得分:0)

通常,您不能将自定义对象传递到UDF中,并且只应为非空行调用udf,否则UDF内部将出现NullPointerException。尝试:

val logCount = (logs: Seq[Row]) => logs.size()
val logCountUdf = udf(logCount)

df.withColumn("LogCount", when($"LogRecords".isNotNull,logCountUdf($"LogRecords")))

或仅使用内置函数size来获取logCount:

df.withColumn("LogCount", size($"LogRecords"))