在 Spark SQL DataFrame 中的 UDF 方法中调用其他方法/变量
Posted
技术标签:
【中文标题】在 Spark SQL DataFrame 中的 UDF 方法中调用其他方法/变量【英文标题】:Calling other methods/variables inside a UDF method in Spark SQL DataFrame 【发布时间】:2016-11-23 17:26:23 【问题描述】:我有一个 Spark SQL DF,我试图在其中调用一个 UDF [ 我使用 Spark SQL udf
创建。
val udfName = udf(somemethodName)
val newDF = df.withColumn("columnnew", udfName(col("anotherDFColumn"))
我正在尝试使用在 somemethodName 中存储为 val
的另一个 DF,但 DF 以 null 的形式出现。
只有当我在 newDF
中使用 where 子句时才会发生这种情况。
我错过了什么吗?难道不能在 UDF 方法中使用另一个变量/方法吗?
或者我必须对广播做些什么?目前我在本地运行它,而不是在集群中。
【问题讨论】:
【参考方案1】:难道不能在UDF方法中使用其他变量/方法
当且仅当该变量/方法可以序列化时是可能的 - UDF 是一个必须序列化并分发给执行程序的闭包。
Dataframe 无法序列化(它是指向其他分布式数据的指针,因此如果不将其收集到驱动程序内存中就没有逻辑方法来序列化它),因此当您尝试时显示为 null
使用 UDF。
您可能需要 join
某个键上的两个数据帧,然后使用从连接的数据帧中获取列的 UDF(或标准转换)。
【讨论】:
其实Dataset
/Dataframe
是可以序列化的。只是不能在 UDF 闭包中使用。
@Tzach Zohar:数据帧之间没有公共键,所以我无法加入,另一个数据帧只是一个查找文件。有一些范围值,如 0 到 60 等。我怎么能使用 UDF 中的查找?我希望我可以读取 udf 方法中的查找文件,但是对于每条记录,我需要加载整个文件...
@LostInOverflow:我可以使用在 UDF 方法名称之外定义的列表吗?我打算从文件中读取范围并创建一个列表,然后使用 UDF 方法中的列表.. 它会工作吗?
是的,您可以使用任何非分布式数据结构。以上是关于在 Spark SQL DataFrame 中的 UDF 方法中调用其他方法/变量的主要内容,如果未能解决你的问题,请参考以下文章
在 Spark SQL DataFrame 中的 UDF 方法中调用其他方法/变量
Spark SQL and DataFrame Guide(1.4.1)——之DataFrames