代码之家  ›  专栏  ›  技术社区  ›  ira

在pyspark注册我的自定义项有什么好处吗?

  •  1
  • ira  · 技术社区  · 7 年前

    我有一个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函数有什么好处吗?在什么条件下注册是有益的?什么时候没关系?或者注册是在引擎盖下自动完成的?

    1 回复  |  直到 7 年前
        1
  •  3
  •   martinarroyo    7 年前

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

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

    由于性能原因,您应该始终以第一种类型的转换为目标,但是如果您尝试使用sparkapi实现的转换不可行,那么您只能选择udf。

    推荐文章