在pyspark中注册udf有什么好处?

时间:2018-10-02 13:15:29

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

我有一个python函数,例如:

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

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

然后我做类似的事情:

udf

首先注册python函数会有什么好处吗?在什么情况下注册受益?什么时候没关系?还是在后台自动完成注册?

1 个答案:

答案 0 :(得分:2)

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

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

出于性能方面的考虑,您应该始终将目标放在第一种类型的转换上,但是如果您尝试使用Spark API实现的转换不可行,则唯一的选择就是UDF。