在 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操作

Spark-SQL之DataFrame操作大全

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

Spark SQL and DataFrame Guide(1.4.1)——之DataFrames

学习笔记Spark—— Spark SQL应用—— Spark DataFrame基础操作

[Spark][Python][DataFrame][SQL]Spark对DataFrame直接执行SQL处理的例子