如何不使用UDF对Spark SQL结果进行后处理

时间:2019-03-07 08:26:21

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我读过

https://medium.com/teads-engineering/spark-performance-tuning-from-the-trenches-7cbde521cf60

建议不要使用UDF节省反序列化/序列化成本。

就我而言,我做了这样的查询

select MYFUN(f1, f2, ...) 
from A ...

我使用MYFUN逐行对查询结果进行后处理,例如,将其发送到其他服务。

def my_fun(f1, f2, ...):
   service.send(f1, f2, ...)

session.udf.register('MYFUN', my_fun)

不使用UDF,我可能想将查询结果保存到Python数据框或hdfs上的Parque表中,然后按一个数据框读取,然后逐个处理该数据框。

问题是结果表的大小很大,可能是1M行。 在这种情况下,删除UDF是否仍然有意义?

将Spark SQL结果填充到另一服务的最佳实践是什么?

1 个答案:

答案 0 :(得分:1)

从性能的角度来看,不建议使用Python UDF,但是在需要时使用它们没有什么错误,因为在这种情况下:与您的{引入的I / O等待相比,序列化/反序列化的成本可能是荒谬的{1}}。因此,删除UDF可能没有意义。

在更一般的情况下,有两种方法可以减少处理数据帧的内存占用量。您已经提到的一个是保存到文件并处理文件。

另一种方法是在数据框上使用toLocalIterator。这样,您将在数据框的每个分区上进行迭代:您可以对数据框进行重新分区以制作任意大小的分区:

send

这样,您的本地内存需求将减少到重新分区数据帧的最大分区。