您好,登錄后才能下訂單哦!
mapreduce中怎么實現二次排序,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
二次排序的原理是將key自定義為一個其他的Bean對象,該對象中存儲兩個變量,一個為正常需要排序的key,第二個為需要作為二次排序的key,并為這個對象提供比較方法
/** * @ClassName IntPair * @Description * 定義IntPair對象,該對象實現WritableComparable接口,描述第一列和第二列數據,同時完成兩列數據的相關操作 * ,這里是對二者進行比較 * @date 2014年11月10日 上午10:15:34 * */ public static class IntPair implements WritableComparable<IntPair> { String first; int second; /** * Set the left and right values. */ public void set(String left, int right) { first = left; second = right; } public String getFirst() { return first; } public int getSecond() { return second; } public int getFileName() { return fileName; } public void setFileName(int fileName) { this.fileName = fileName; } @Override // 反序列化,從流中的二進制轉換成IntPair public void readFields(DataInput in) throws IOException { first = in.readUTF(); second = in.readInt(); fileName = in.readInt(); } @Override // 序列化,將IntPair轉化成使用流傳送的二進制 public void write(DataOutput out) throws IOException { out.writeUTF(first); out.writeInt(second); out.writeInt(fileName); } @Override // key的比較 public int compareTo(IntPair o) { if (!first.equals(o.first)) { return o.first.compareTo(first); } else if (second != o.second) { return second > o.second ? 1 : -1; } else { return 0; } } @Override public boolean equals(Object right) { if (right == null) return false; if (this == right) return true; if (right instanceof IntPair) { IntPair r = (IntPair) right; return r.first.equals(first) && r.second == second; } else { return false; } } }
為了能讓第一次排序的正常排序需要使用Partitioner和
/** * 分區函數類。根據first確定Partition。 */ public static class FirstPartitioner extends Partitioner<IntPair, Text> { @Override public int getPartition(IntPair key, Text value, int numPartitions) { return key.first.hashCode()%numPartitions; } }
/** * 分組函數類。只要first相同就屬于同一個組。 */ // 第二種方法,繼承WritableComparator public static class GroupingComparator extends WritableComparator { protected GroupingComparator() { super(IntPair.class, true); } @SuppressWarnings("rawtypes") @Override // Compare two WritableComparables. public int compare(WritableComparable w1, WritableComparable w2) { IntPair ip1 = (IntPair) w1; IntPair ip2 = (IntPair) w2; String l = ip1.getFirst(); String r = ip2.getFirst(); return r.compareTo(l); } }
然后在main函數中的job中加入
job.setMapOutputKeyClass(IntPair.class); job.setGroupingComparatorClass(GroupingComparator.class); job.setPartitionerClass(FirstPartitioner.class);
關于mapreduce中怎么實現二次排序問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。