MapReduce服务 MRS-建议:Spark SQL动态分区插入优化之Distributeby
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 by和sort by才能有效减少小文件数量。
- Hudi服务_什么是Hudi_如何使用Hudi
- MapReduce服务_如何使用MapReduce服务_MRS集群客户端安装与使用
- 大数据分析是什么_使用MapReduce_创建MRS服务
- 什么是Spark SQL作业_数据湖探索DLISpark SQL作业
- MapReduce服务_什么是ClickHouse_如何使用ClickHouse
- 什么是Spark_如何使用Spark_Spark的功能是什么
- MapReduce服务_什么是Hive_如何使用Hive
- MapReduce服务_什么是Hue_如何使用Hue
- MapReduce服务_什么是Loader_如何使用Loader
- MapReduce工作原理_MapReduce是什么意思_MapReduce流程_MRS_华为云