我想知道PIG实际上是如何决定如何在reduce阶段对数据进行分区的,以及我是否可以影响数据分布以避免reducer负载不平衡。
例如:grouped_data = GROUP data BY (year, month, day) PARALLEL 10;
是否可以更改分区,例如:1)分组操作前对数据进行洗牌或2.)改变元组中变量的顺序???
或者你建议另一种方法?
提前感谢!
默认情况下,在大多数情况下,PIG使用Hadoop的默认分区器,即HashPartitioner。
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
您可以使用PARTITION BY
来提供您自己的策略。
B = GROUP data BY (year, month, day) PARTITION BY foo.bar.CustomPartitioner PARALLEL 10;