我有一个 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 运行。这就是您在示例代码中使用的内容(
when
、otherwise
等)。 - Spark API 无法涵盖每一个转换,因此 Spark 允许程序员定义自己的转换,这就是用户定义函数 (UDF)。您需要提前声明并注册它们,以便 Spark 知道它期望什么输入和输出数据。这种机制的优点是您可以定义任何转换,而不受 Spark API 的限制。但是,它们没有 JVM 对应项,因此将在纯 Python 中执行,从而增加 JVM 和 Python 执行器之间的通信开销。
由于性能原因,您应该始终以第一种类型的转换为目标,但如果使用 Spark API 无法实现您想要实现的目标,那么您唯一的选择就是 UDF。
关于python - 在 pyspark 中注册我的 udf 有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52609143/