
# 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"配置文件中调整如下参数。
表1参数说明 
| 参数                           | 描述                        | 默认值 |
|:---|:---|:---|
| spark.sql.shuffle.partitions | shuffle操作时，shuffle数据的分块数。 | 200 |
   
