将输出Map为csv还是需要键值?

brqmpdu1  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(277)

我的map函数生成一个 Key\tValue 值=列表(值1、值2、值3)
然后我的reduce函数产生: Key\tCSV-Line 前任。
23232-2322 fdsfs,sdfs,dfsfs,0,0,0,2,fsda,3,23,3,s,
23555-22222 dfasd、sdfas、adfs、0,0,2,0、fasafa、2,23、s
例如原始数据: 232342|@3423@|34343|sfasdfasdF|433443|Sfasfdas|324343 x 1000个
不管怎样,我想在一开始就去掉密钥,这样我的客户机就可以直接导入mysql了。我有大约50个数据文件,我的问题是在它Map了它们一次之后,减速机启动了,它需要打印出带有值的键还是我可以只打印值?
更多信息:
在这里,这段代码可能会更好地说明这种情况
http://pastebin.ca/2410217
这是我计划要做的。

rkue9o1l

rkue9o1l1#

您的reducer可以发出一行而不使用\t,或者,在您的情况下,只发出您所调用的值。不幸的是,hadoop流将把它解释为一个带有空值的键,并在每一行的末尾自动附加一个分隔符(默认情况下是\t)。您可以更改这个分隔符是什么,但是,当我使用它时,我无法使它不附加分隔符。我不记得确切的细节,但基于此(hadoop:key和value在输出文件中用tab分隔)。如何用分号分隔?)我认为这个属性是mapred.textoutputformat.separator。我的解决方案是在我将文件拉回来时,将每行末尾的\t去掉:

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

lxkprmvk2#

如果不想发射关键点,请将其设置为 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));
        }

让我知道如果这不是你需要的,我会相应地更新答案。

相关问题