从文件中按Hadoop中的值排序

Dee*_*thi 5 java hadoop hadoop-streaming

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

例:

Line1: Word 2
Line2 : Word1 8
Line3: Word2 1
Run Code Online (Sandbox Code Playgroud)

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

Line1: Word1 8 1
Line2: Word  2 2
Line3: Word2 1 3
Run Code Online (Sandbox Code Playgroud)

有没有人有想法,我怎么能在Hadoop中做到这一点?我正在使用Java与Hadoop.

Tud*_*dor 9

您可以像这样组织地图/减少计算:

地图输入:默认

地图输出:"key:number,value:word"

_按键排序_

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

减少-1减速器

减少输入:"键:数字,值:字"

减少输出:"关键:字,值:(数字,等级)"

保持全球反击.对于每个键值对,通过递增计数器来添加等级.

编辑:这是一个自定义后代分拣机的代码剪辑:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

job.setSortComparatorClass(IntComparator.class);
Run Code Online (Sandbox Code Playgroud)


vpa*_*pap 5

Hadoop Streaming - Hadoop 1.0.x

根据这个,之后

bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.*.jar
Run Code Online (Sandbox Code Playgroud)
  1. 你添加一个比较器

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

  2. 您指定所需的排序类型

    -D mapred.text.key.comparator.options = - [options]

其中[options]类似于Unix 排序.这里有些例子,

相反的顺序

-D mapred.text.key.comparator.options=-r
Run Code Online (Sandbox Code Playgroud)

按数值排序

-D mapred.text.key.comparator.options=-n
Run Code Online (Sandbox Code Playgroud)

按值或任何字段排序

-D mapred.text.key.comparator.options=-kx,y
Run Code Online (Sandbox Code Playgroud)

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


Dee*_*thi 3

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

要按值排序,您需要使用

setOutputValueGroupingComparator(Class)
Run Code Online (Sandbox Code Playgroud)

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

对于排名,您需要使用 Counter class,getCounter和increment函数。

  • 双写呢? (2认同)