在Spark SQL DataFrame中调用UDF方法中的其他方法/变量

时间:2016-11-23 17:26:23

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

我有一个Spark SQL DF,其中我试图调用一个UDF [我使用Spark SQL udf创建。

val udfName = udf(somemethodName)
val newDF = df.withColumn("columnnew", udfName(col("anotherDFColumn"))

我试图在somemethodName中使用另一个存储为val的DF,但DF将变为空。

仅当我在newDF中使用where子句时才会发生这种情况。

我错过了什么?是不是可以在UDF方法中使用另一个变量/方法?

或者我必须做广播吗?目前我在本地运行它,而不是在集群中运行。

1 个答案:

答案 0 :(得分:2)

  

是否无法在UDF方法中使用其他变量/方法

是可能的,当且仅当该变量/方法可以序列化时 - UDF是一个必须序列化并分发给执行者的闭包。

Dataframe 无法序列化(它是指向其他分布式数据的指针,因此没有逻辑方法可以将其序列化而不将其收集到驱动程序内存中),因此当您显示为null时尝试使用UDF。

您可能需要join某个键上的两个数据帧,然后使用从连接的Dataframe中获取列的UDF(或标准转换)。