gpt4 book ai didi

sorting - 如何在hadoop中实现排序?

转载 作者:可可西里 更新时间:2023-11-01 14:14:28 26 4
gpt4 key购买 nike

我的问题是对文件中的值进行排序。键和值都是整数,需要维护排序值的键。

key   value
1 24
3 4
4 12
5 23

输出:

1     24
5 23
4 12
3 4

我正在处理海量数据,必须在 hadoop 机器集群中运行代码。我如何使用 mapreduce 做到这一点?

最佳答案

你可能可以这样做(我假设你在这里使用 Java)

从 map 发出这样的 -

context.write(24,1);
context.write(4,3);
context.write(12,4)
context.write(23,5)

因此,所有需要排序的值都应该是 mapreduce 作业中的键。Hadoop 默认按键的升序排序。

因此,要么你这样做是为了降序排序,

job.setSortComparatorClass(LongWritable.DecreasingComparator.class);

或者,这个,

您需要设置一个自定义的降序排序比较器,这在您的工作中是这样的。

public static class DescendingKeyComparator extends WritableComparator {
protected DescendingKeyComparator() {
super(Text.class, true);
}

@SuppressWarnings("rawtypes")
@Override
public int compare(WritableComparable w1, WritableComparable w2) {
LongWritable key1 = (LongWritable) w1;
LongWritable key2 = (LongWritable) w2;
return -1 * key1.compareTo(key2);
}
}

Hadoop 中的 suffle 和 sort 阶段将负责按 24,4,12,23 的降序对您的键进行排序

评论后:

如果你需要一个 Descending IntWritable Comparable,你可以创建一个并像这样使用它 -

job.setSortComparatorClass(DescendingIntComparable.class);

如果您正在使用JobConf,请使用它来设置

jobConfObject.setOutputKeyComparatorClass(DescendingIntComparable.class);

将以下代码放在 main() 函数下面 -

public static void main(String[] args) {
int exitCode = ToolRunner.run(new YourDriver(), args);
System.exit(exitCode);
}

//this class is defined outside of main not inside
public static class DescendingIntWritableComparable extends IntWritable {
/** A decreasing Comparator optimized for IntWritable. */
public static class DecreasingComparator extends Comparator {
public int compare(WritableComparable a, WritableComparable b) {
return -super.compare(a, b);
}
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
return -super.compare(b1, s1, l1, b2, s2, l2);
}
}
}

关于sorting - 如何在hadoop中实现排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18154686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com