python - 在 pyspark 中注册我的 udf 有什么好处吗?

标签 python apache-spark pyspark user-defined-functions

我有一个 python 函数,例如:

 def blank_as_null(x):
     return when(col(x) != "", col(x)).otherwise(None)

我正在使用此功能而不运行 udf(blank_as_null, StringType())按照文档中的建议:http://spark.apache.org/docs/2.2.0/api/python/pyspark.sql.html或在此视频中:https://youtu.be/AsW0QzbYVow?t=42m33s (42:33处可以看到调用udf函数的代码)

然后我做了类似的事情:

myData.withColumn('myColumn', blank_as_null('myColumn'))

首先注册 python 函数有什么好处吗?什么情况下注册有利?什么时候不重要?或者注册是在幕后自动完成的?

最佳答案

我认为您正在混合两种不同的转换:PySpark API 和 UDF:

  • PySpark API 转换(由于缺乏更好的名称)是使用 PySpark 提供的现有功能的任何转换。它们映射到 Scala API,并在 JVM 中 native 运行。这就是您在示例代码中使用的内容(whenotherwise 等)。
  • Spark API 无法涵盖每一个转换,因此 Spark 允许程序员定义自己的转换,这就是用户定义函数 (UDF)。您需要提前声明并注册它们,以便 Spark 知道它期望什么输入和输出数据。这种机制的优点是您可以定义任何转换,而不受 Spark API 的限制。但是,它们没有 JVM 对应项,因此将在纯 Python 中执行,从而增加 JVM 和 Python 执行器之间的通信开销。

由于性能原因,您应该始终以第一种类型的转换为目标,但如果使用 Spark API 无法实现您想要实现的目标,那么您唯一的选择就是 UDF。

关于python - 在 pyspark 中注册我的 udf 有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52609143/

相关文章:

python - 了解经过训练的神经网络内存使用情况

python - 如何更快地使用 Google map 进行地理编码?

python - 显示两组标签的颜色条

scala - Scala Spark 中未找到 reduceByKey 方法

json - 无法将数据集从SPARK传输到HBase表

python - 如何使用新的 mplfinance 包编辑图

scala - 将多个小文件合并到 Spark 中的几个大文件中

apache-spark - 如何在同一列pyspark sql中过滤多个条件

python - 计算pyspark中数据帧所有行之间的余弦相似度

python - 将不同数据帧中的列添加到 PySpark 中的目标数据帧