什么时候使用UDF和使用spark功能是合适的?



在过去的几个星期里,我一直在扩展我对spark的知识,我一直在为工作做所有的测试,我有点困惑,什么时候使用UDF合适,什么时候不合适。看看一些同行的代码,他们在使用数据帧时使用了很多UDF,但它们是如此的资源密集型。因为我已经重构了很多他们的代码,我用spark.sql()重写了很多,它要快得多,我只使用spark功能。话虽如此,什么时候使用UDF比仅仅使用spark的内置功能更合适呢?

这很简单:建议尽可能依赖Spark的内置函数,并且仅在无法使用内置函数完成转换时使用UDF。

udf不能被Spark的Catalyst优化器优化,所以总是有可能降低性能。UDF的开销很大,因为它们强制将数据表示为JVM中的对象。

由于您还使用了[pyspark]标签,并且在下面的评论中提到,可能会对"Panda udf "(又名向量化udf)避免了JVM和Python之间的数据移动。相反,他们使用Apache Arrow来传输数据,使用Pandas来处理数据。您可以使用pandas_udf来使用Panda UDF,并在Databricks博客介绍Pandas UDF for PySpark中阅读更多信息,该博客有一个专门的性能比较部分。

您的同行可能使用了许多udf,因为在早期版本的Spark中没有内置函数。每个版本都有更多的功能被添加。

最新更新