Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在Spark中,如何使用UDO作为参数调用UDF以避免二进制错误_Apache Spark_Apache Spark Sql - Fatal编程技术网

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

Apache spark 在Spark中,如何使用UDO作为参数调用UDF以避免二进制错误,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我用UDO作为参数定义了一个UDF。但是当我试图在dataframe中调用它时,我得到了错误消息“org.apache.spark.SparkException:无法执行用户定义的函数($anonfun$1:(array)=>int)”。我只是想知道,异常将UDO称为二进制,我应该如何修复它 val logCount = (logs: util.List[LogRecord]) => logs.size() val logCountUdf = udf(logCount) // The co

我用UDO作为参数定义了一个UDF。但是当我试图在dataframe中调用它时,我得到了错误消息“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
获取日志计数:

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

实际上,该列不会为null,因为前面有过滤器逻辑。问题中提到了我在这里遇到的错误:org.apache.spark.SparkException:未能执行用户定义函数($anonfun$1:(array)=>int)我看到这里的udf参数您只是将其设置为Seq[Row],所以我们不能将参数与Row以外的类型一起使用吗?@TommyTan抱歉,我没有注意到Sparks用户定义的类型(这在Spark 2中被删除了)。也许可以将UDT传递给UDF,但问题是在其他地方它现在可以将UDO用作参数。但是我仍然有关于UDO作为返回值的问题。