文档首页/
    
      
      MapReduce服务 MRS/
      
      
        
        
        组件操作指南(普通版)(巴黎区域)/
        
        
        使用Spark2x/
        
        
        Spark2x常见问题/
        
        
        SQL和DataFrame/
        
      
      Repartition时有部分Partition没数据
    
  
  
    
        更新时间:2022-02-22 GMT+08:00
        
          
          
        
      
      
      
      
      
      
      
      
  
      
      
      
        
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  | 
     
   父主题: SQL和DataFrame