什么时候使用 UDF 与使用 spark 功能比较合适?

When is it appropriate to use a UDF vs using spark functionality?

在过去的几周里,我一直在通过我为工作所做的所有测试来扩展我对 spark 的了解,但我有点困惑什么时候适合使用 A UDF,什么时候适合不是。查看一些同行代码,他们在使用数据帧时使用了很多 UDF,但它们非常耗费资源。因为我重构了他们的很多代码,所以我使用 spark.sql() 重写了很多代码,速度更快,而且我只使用了 spark 功能。话虽如此,什么时候使用 UDF 与仅使用 spark 的内置功能比较合适?

很简单:建议尽可能依赖Spark的内置函数,只有当你的转换不能用内置函数完成时才使用UDF。

UDF 无法通过 Spark 的 Catalyst 优化器进行优化,因此性能始终存在潜在下降。 UDF 很昂贵,因为它们强制将数据表示为 JVM 中的对象。

因为您也使用了标签 [pyspark] 并且如以下评论中所述,“Panda UDF”(又名矢量化 UDF)避免 JVM 和 [=20= 之间的数据移动可能很有趣].相反,他们使用 Apache Arrow 来传输数据并使用 Pandas 来处理它。您可以通过 pandas_udf 使用 Panda UDF,并在 Databricks 博客 Introducing Pandas UDF for PySpark 中阅读更多相关信息,其中有专门的性能比较部分。

您的同行可能使用了很多 UDF,因为内置函数在早期版本的 Spark 上不可用。每个版本都会添加更多功能。