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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Spark中如何使用UDO作为参数调用UDF以避免二进制错误相关的知识,希望对你有一定的参考价值。

我用UDO作为参数定义了一个UDF。但是当我试图在数据框中调用它时,我收到错误消息“org.apache.spark.SparkException:无法执行用户定义的函数($ anonfun $ 1:(array)=> 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"))
答案

通常,您无法将自定义对象传递给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"))

以上是关于在Spark中如何使用UDO作为参数调用UDF以避免二进制错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将复杂的 Java 类对象作为参数传递给 Spark 中的 Scala UDF?

如何将 Set/HashSet 作为参数传递给 Spark 中的 UDF?

我可以将 spark 数据帧作为参数发送给 pandas UDF

整数、长整数或双精度类型作为 Spark UDF 的函数参数

如何在不指定每一列的情况下将整行作为参数传递给 Spark(Java)中的 UDF?

java,如何在spark 1.4.1中调用UDF [重复]