6

我的地图功能产生

Key\tValue

值 = 列表(值 1,值 2,值 3)

然后我的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|324343x 1000

无论如何,我想在开始时消除密钥,以便我的客户可以直接导入 mysql。我有大约 50 个数据文件,我的问题是在它映射一次并且减速器启动之后,它需要打印出带有值的键还是我可以只打印值?


更多信息:

在这里,这段代码可能会更好地说明这种情况

http://pastebin.ca/2410217

这有点像我打算做的。

4

2 回答 2

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));
        }

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

于 2013-06-27T01:43:25.400 回答
2

您的 reducer 可以发出没有 \t 的行,或者在您的情况下,就是您所称的值。不幸的是,hadoop 流将其解释为具有空值的键,并自动将分隔符(默认为 \t)附加到每行的末尾。您可以更改此分隔符,但是,当我使用它时,我无法让它不附加分隔符。我不记得确切的细节,但基于此(Hadoop:键和值在输出文件中以制表符分隔。如何用分号分隔?)我认为属性是 mapred.textoutputformat.separator。我的解决方案是在我拉回文件时去掉每行末尾的 \t :

hadoop fs -cat hadoopfile | perl -pe 's/\t$//' > destfile
于 2013-06-27T21:55:00.630 回答