我对 hadoop 流非常陌生,并且在分区方面遇到了一些困难。
根据在一行中找到的内容,我的映射器函数要么返回
key1, 0, somegeneralvalues # some kind of "header" line where linetype = 0
或者
key1, 1, value1, value2, othervalues... # "data" line, different values, linetype =1
为了正确减少,我需要对具有相同key1的所有行进行分组,并按 value1、value2 和线型(0 或 1)对它们进行排序,例如:
1 0 foo bar... # header first
1 1 888 999.... # data line, with lower value1
1 1 999 111.... # a few datalines may follow. Sort by value1,value2 should be performed
------------ #possible partition here, and only here in this example
2 0 baz foobar....
2 1 123 888...
2 1 123 999...
2 1 456 111...
有没有办法确保这样的分区?到目前为止,我已经尝试过使用诸如
-partitioner,'org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner'
-D stream.num.map.output.key.fields=4 # please use 4 fields to sort data
-D mapred.text.key.partitioner.options=-k1,1 # please make partitions based on first key
或者
-D num.key.fields.for.partition=1 # Seriously, please group by key1 !
但这只会带来愤怒和绝望。
如果值得一提,如果我使用cat 数据,我的脚本可以正常工作 | 映射器 | 排序 | 减少 ,我正在使用亚马逊弹性地图减少红宝石客户端,所以我将选项传递给
--arg '-D','options' for the ruby script.
任何帮助将不胜感激!提前致谢