5

我有一个文件,其中包含一个字符串,然后是一个空格,然后每行都有一个数字。

例子:

Line1: Word 2
Line2 : Word1 8
Line3: Word2 1

我需要按降序对数字进行排序,然后将结果放入为数字分配排名的文件中。所以我的输出应该是一个包含以下格式的文件:

Line1: Word1 8 1
Line2: Word  2 2
Line3: Word2 1 3

有谁知道,我怎么能在 Hadoop 中做到这一点?我正在将 java 与 Hadoop 一起使用。

4

3 回答 3

9

你可以像这样组织你的 map/reduce 计算:

地图输入:默认

地图输出:“键:数字,值:单词”

_ 按键排序阶段 _

在这里,您将需要覆盖默认排序器以按降序排序。

减少 - 1个减速器

减少输入:“键:数字,值:单词”

减少输出:“key: word, value: (number, rank)”

保留一个全局计数器。对于每个键值对,通过递增计数器来添加排名。

编辑:这是自定义后代排序器的代码片段:

public static class IntComparator extends WritableComparator {

    public IntComparator() {
        super(IntWritable.class);
    }

    @Override
    public int compare(byte[] b1, int s1, int l1,
            byte[] b2, int s2, int l2) {

        Integer v1 = ByteBuffer.wrap(b1, s1, l1).getInt();
        Integer v2 = ByteBuffer.wrap(b2, s2, l2).getInt();

        return v1.compareTo(v2) * (-1);
    }
}

不要忘记将其实际设置为您工作的比较器:

job.setSortComparatorClass(IntComparator.class);
于 2011-11-27T22:28:47.243 回答
5

Hadoop 流 - Hadoop 1.0.x

据此经过

bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.*.jar
  1. 你添加一个比较器

    -D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator

  2. 你指定你想要的排序类型

    -D mapred.text.key.comarator.options=-[选项]

其中 [options] 类似于 Unix sort。这里有些例子,

相反的顺序

-D mapred.text.key.comparator.options=-r

按数值排序

-D mapred.text.key.comparator.options=-n

按值或任何字段排序

-D mapred.text.key.comparator.options=-kx,y

使用 -k 标志指定排序键。x, y 参数定义这个键。因此,如果您有一个包含多个标记的行,您可以选择所有标记中的哪个标记将作为排序的关键,或者标记的哪个组合将作为排序的关键。有关更多详细信息和示例,请参阅参考资料。

于 2012-08-20T09:59:40.697 回答
2

我设计了解决这个问题的方法。其实很简单。

对于按值排序,您需要使用

setOutputValueGroupingComparator(Class)

要按降序排序,您需要使用setSortComparatorClass(LongWritable.DecreasingComparator.class);

对于排名,您需要使用 Counter class,getCounterincrement函数。

于 2012-02-03T18:16:02.783 回答