Repartition时有部分Partition没数据
问题
在repartition操作时,分块数“spark.sql.shuffle.partitions”设置为4500,repartition用到的key列中有超过4000个的不同key值。期望不同key对应的数据能分到不同的partition,实际上却只有2000个partition里有数据,不同key对应的数据也被分到相同的partition里。
回答
这是正常现象。
数据分到哪个partition是通过对key的hashcode取模得到的,不同的hashcode取模后的结果有可能是一样的,那样数据就会被分到相同的partition里面,因此出现有些partition没有数据而有些partition里面有多个key对应的数据。
通过调整“spark.sql.shuffle.partitions”参数值可以调整取模时的基数,改善数据分块不均匀的情况,多次验证发现配置为质数或者奇数效果比较好。
在Driver端的“spark-defaults.conf”配置文件中调整如下参数。
参数 |
描述 |
默认值 |
---|---|---|
spark.sql.shuffle.partitions |
shuffle操作时,shuffle数据的分块数。 |
200 |