MapReduce服务 MRS-建议:Spark SQL动态分区插入优化之Distributeby

时间:2023-11-01 16:19:45

Spark SQL动态分区插入优化之Distributeby

如下SQL中,p1和p2是target表的分区字段,使用distribute by关键字来减少小文件的产生。

insert overwrite table target partition(p1,p2)select * from sourcedistribute by p1, p2 

Spark程序以动态分区的方式写入Hive表时,会出现了大量的小文件,导致最后移动文件到hive表目录非常耗时,这是因为在Shuffle时Hive多个分区的数据随机落到Spark的多个Task中,此时Task与Hive分区数据的关系是多对多,即每个Task会包含多个分区的部分数据,每个Task中包含的每个分区的数据都很少,最终会导致Task写多个分区文件,每个分区文件都比较小。

为了减少小文件的数量,需要将数据按照分区字段进行Shuffle,将各个分区的数据尽量各自集中在一个Task,在Spark SQL中就是通过distribute by关键字来完成这个功能的。

当使用distribute by关键字在后出现了数据倾斜,即有的分区数据多,有的分区数据少,也会导致spark 作业整体耗时长。需要在distribute by后面增加随机数,例如:

insert overwrite table target partition(p1,p2)select * from sourcedistribute by p1, p2, cast(rand() * N as int)

N值可以在文件数量和倾斜度之间做权衡。

在Spark SQL中使用动态分区写入数据,需要同时使用distribute bysort by才能有效减少小文件数量。

support.huaweicloud.com/devg3-mrs/mrs_07_450119.html