我有一个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方法中使用另一个变量/方法?
或者我必须做广播吗?目前我在本地运行它,而不是在集群中运行。
答案 0 :(得分:2)
是否无法在UDF方法中使用其他变量/方法
是可能的,当且仅当该变量/方法可以序列化时 - UDF是一个必须序列化并分发给执行者的闭包。
Dataframe 无法序列化(它是指向其他分布式数据的指针,因此没有逻辑方法可以将其序列化而不将其收集到驱动程序内存中),因此当您显示为null
时尝试使用UDF。
您可能需要join
某个键上的两个数据帧,然后使用从连接的Dataframe中获取列的UDF(或标准转换)。