粗暴的临时解决方法
增大partition数, 让partition中的数据量<2g
由于是left join触发了shuffle操作, 而spark默认join时的分区数为200(即spark.sql.shuffle.partitions...确认数据倾斜
方法一: 通过sample算子对DataSet/DataFrame/RDD进行采样, 找出top n的key值及数量
方法二: 源数据/中间数据落到存储中(如HIVE), 直接查询观察
3.2...可选方法
HIVE ETL 数据预处理
把数据倾斜提前到 HIVE ETL中, 避免Spark发生数据倾斜
这个其实很有用
过滤无效的数据 (where / filter)
NULL值数据
“脏数据”(...多阶段
aggregate操作: 先局部聚合, 再全局聚合
给key打随机值, 如打上1-10, 先分别针对10个组做聚合
最后再统一聚合
join操作: 切成多个部分, 分开join, 最后union...判断出,造成数据倾斜的一些key值 (可通过观察或者sample取样)
如主号
单独拎出来上述key值的记录做join, 剩余记录再做join
独立做优化, 如broadcast
结果数据union即可