Map将输出减少到CSV还是需要键值?

时间:2013-06-26 23:38:25

标签: hadoop mapreduce hadoop-streaming elastic-map-reduce

我的地图功能产生了

Key\tValue

Value = List(value1,value2,value3)

然后我的reduce函数产生:

Key\tCSV-Line

实施例


2323232-2322 fdsfs,sdfs,dfsfs,0,0,0,2,fsda,3,23,3,s,

2323555-22222 dfasd,sdfas,adfs,0,0,2,0,fasafa,2,23,s


实施例。原始数据: 232342|@3423@|34343|sfasdfasdF|433443|Sfasfdas|324343 x 1000

无论如何,我想在开头消除密钥,以便我的客户端可以直接导入到mysql中。我有大约50个数据文件,我的问题是它映射它们一次后,reducer启动它是否需要打印出值的键或者我可以打印该值吗?


更多信息:

此处此代码可能会更好地阐明情况

http://pastebin.ca/2410217

这有点像我打算做的事。

2 个答案:

答案 0 :(得分:13)

如果您不想发出密钥,请在代码中将其设置为NullWritable。例如:

public static class TokenCounterReducer extends
            Reducer<Text, IntWritable, NullWritable, IntWritable> {
        public void reduce(Text key, Iterable<IntWritable> values,
                Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable value : values) {
                sum += value.get();
            }
            context.write(NullWritable.get(), new IntWritable(sum));
//          context.write(key, new IntWritable(sum));
        }

如果这不是你需要的,请告诉我,我会相应地更新答案。

答案 1 :(得分:2)

您的减速器可以在没有\ t的情况下发出一条线,或者在您的情况下,只是您正在调用的值。不幸的是,hadoop流将把它解释为具有空值的键,并自动将分隔符(默认为\ t)附加到每行的末尾。你可以改变这个分隔符是什么,但是,当我玩这个时,我无法得到它不附加分隔符。我不记得确切的细节,但基于此(Hadoop: key and value are tab separated in the output file. how to do it semicolon-separated?)我认为该属性是mapred.textoutputformat.separator。我的解决方案是在我拉回文件时剥离每行末尾的\ t:

hadoop fs -cat hadoopfile | perl -pe 's/\t$//' > destfile