【问题标题】:Map Reduce output to CSV or do I need Key Values?将 Reduce 输出映射到 CSV 还是我需要键值?
【发布时间】:2013-06-26 23:38:24
【问题描述】:

我的地图函数产生一个

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|324343 x 1000

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


更多信息:

这里的代码可能会更好地说明情况

http://pastebin.ca/2410217

这有点像我打算做的。

【问题讨论】:

  • 您能否重新表述您的问题?您只想发出值而不发出键吗?抱歉,我不太明白。
  • 是的,这正是我想要的哈哈,抱歉这么不清楚。我只是想确保当我在多个数据文件上使用多个服务器时,在 reduce.py 中只发出值而不是键,不会破坏整个操作

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


【解决方案1】:

如果您不想发出密钥,请在代码中将其设置为 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));
        }

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

【讨论】:

  • 感谢您的回复。我相信从外观上看是使用 C# 或 Java,我目前正在使用 python。我会用一些代码更新我的问题,让它更明显:D
  • 添加了一些代码来帮助我解决这个问题:) pastebin.ca/2410217 也许这更好地解释了我在做什么,我想知道它是否有效哈哈
【解决方案2】:

你的 reducer 可以在没有 \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

【讨论】:

  • 我的输出作为 CSV 文件看起来是正确的,但是您是说如果我的减速器输出一个没有键的值,它只会生成一个空键并且无论如何都不会工作?我粘贴了我的代码,也许你可以看看它是否有效:pastebin.ca/2410217
  • 看到我不输出任何键只是值(csv 分隔),但你是说这只会导致 emr 说它是一个空键而不工作?
  • EMR 是来自 Amazon 的 Elastic Map Reduce?我没用过。我们正在运行一个“vanilla”hadoop 集群,我们向该集群提交作业并从中提取数据。在那种环境中,如果你的 reducer 输出的行不包含分隔符,hadoop 会在行的末尾添加一个分隔符。我认为它将该行解释为具有空值的键。至于在 EMR 上运行,我无法猜测。你能用一个小数据集测试它吗?附带说明一下,您似乎在每行的末尾添加了一个额外的“,”。
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多