udf(用户定义函数)如何在 pyspark 中工作?

Posted

技术标签:

【中文标题】udf(用户定义函数)如何在 pyspark 中工作?【英文标题】:How does udf (user defined function) work in pyspark? 【发布时间】:2018-11-26 08:50:12 【问题描述】:

我想了解 udf 在 pyspark 中的工作原理。每次我们在数据帧上使用 udf 时都会打开一个 python shell 吗?

【问题讨论】:

【参考方案1】:

UDF 可以通过 2 种方式提供给 PySpark。

    UDF 可以在 Scala 中定义并使用 PySpark 运行 UDF 可以在 Python 中定义并由 PySpark 运行

在第一种情况下,UDF 将作为 Executor JVM 本身的一部分运行,因为 UDF 本身是在 Scala 中定义的。无需创建python进程。

在第二种情况下,每个执行器都会启动一个 python 进程。数据将在 executor 和 python 之间进行序列化和反序列化以进行处理。这会导致 Spark 作业的大量性能影响和开销。

通常最好使用基于 Scala 的 UDF,因为它们会给您带来更好的性能。

在 spark 2.x 中有一种叫做 Pandas Udf(矢量化 UDF)的东西。它们是使用 Pandas 实现的(使用 apache 箭头转换数据框)。基本上你用 python 编写代码,但是代码是使用 pandas 转换和运行的。这极大地提高了 Python 中 UDF 的性能。 我希望这会有所帮助。

【讨论】:

【参考方案2】:

Spark 运行一个与每个执行器并行的 python 进程,并在 Scala 部分(执行器)和 python 之间来回传递数据。

这对性能和内存消耗(以及调整 spark 作业时的管理)有很多影响

【讨论】:

以上是关于udf(用户定义函数)如何在 pyspark 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

在 PySpark Pandas UDF 中指定用户定义函数的正确方法

PySpark 用户定义函数 (UDF) 创建新列

pyspark中未定义的函数UDF?

从Pyspark UDF调用另一个自定义Python函数

PySpark 传递列表到用户定义函数

具有联合的子字符串在用户定义的函数中工作方式不同