Blo*_*d01 2 user-defined-functions apache-spark apache-spark-sql pyspark
在过去的几周里,我一直在通过工作中所做的所有测试来扩展我对 Spark 的了解,但我有点困惑,什么时候适合使用 UDF,什么时候不适合。查看一些同行代码,他们在使用数据帧时使用了很多UDF' ,但它们非常占用资源。因为我重构了他们的很多代码,所以我使用spark.sql() 重写了很多代码,而且速度更快,而且我只使用 Spark 功能。话虽如此,什么时候使用 UDF 比较合适,什么时候只使用 Spark 的内置功能比较合适?
这很简单:建议尽可能依赖 Spark 的内置函数,并且仅当无法使用内置函数完成转换时才使用 UDF。
UDF 无法通过 Spark 的 Catalyst 优化器进行优化,因此始终存在潜在的性能下降。UDF 很昂贵,因为它们强制将数据表示为 JVM 中的对象。
由于您还使用了标签 [pyspark] 并且如下面的评论中所述,“Panda UDF”(又名矢量化 UDF)避免了 JVM 和 Python 之间的数据移动,这可能会令人感兴趣。相反,他们使用 Apache Arrow 来传输数据,并使用 Pandas 来处理数据。您可以使用 Panda UDF,并pandas_udf在 Databricks 博客Introducing Pandas UDF for PySpark中阅读更多相关信息,该博客有专门的性能比较部分。
您的同行可能使用了许多 UDF,因为内置函数在早期版本的 Spark 上不可用。每个版本都会添加更多功能。