2016-11-23 114 views
0

我有一个Spark SQL DF,其中我尝试调用一个UDF [我使用Spark SQL创建的udf在Spark SQL DataFrame中调用UDF方法中的其他方法/变量

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

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

只有当我使用newDF中的where子句时才会发生这种情况。

我错过了什么吗?UDF方法中不可能使用其他变量/方法吗?

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

回答

1

是没可能使用另一个变量/方法UDF方法内

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

一个数据帧不能被序列化(这是一个指向其它分布式数据,所以有连载它没有收集成驾驶员记忆功能不符合逻辑的方式),当您尝试使用UDF因此出现null

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

+1

实际上'Dataset' /'Dataframe'可以被序列化。只是不能用于UDF封闭。 – 2016-11-23 17:37:03

+0

@Tzach Zohar:数据框之间没有公共密钥,所以我无法加入,另一个数据框只是一个查找文件,有一些范围值,如0到60等。我如何使用UDF内的查找?我希望我可以读取UDF方法内的查找文件,但对于我需要加载整个文件的每一条记录... – Shankar

+0

@LostInOverflow:我可以使用在UDF方法名称之外定义的列表吗?我正打算从文件中读取范围并创建一个列表,然后使用UDF方法中的列表..它会工作吗? – Shankar

相关问题