hadoop - 使用Map Reduce生成序列号

标签 hadoop mapreduce

我有一个问题,我需要在整个文件中生成从1开始的序列号。

例如,我有一个 BIG 大文件,如下所示:

abc,123abb,111ccc,122 ..... N这样的行号

现在我的输出应该如下:

1,abc,1232,abb,1113,ccc,122 ....等等。

使用mapreduce进行此操作的问题在于,文件的每个拆分都是由不同的map函数并行处理的,因此无法维护序列。请不要告诉我使用单个 reducer 来执行此操作。我不想使用单个reducer,因为我想使用典型的mapreduce作业并行执行此操作。那么,有什么最好的方法可以使用map-reduce完成吗?

最佳答案

您可以执行此操作,但是有点棘手。您需要使用“mapred_job_id”环境变量,该变量为您提供 reducer 的作业ID。

例如,当您读取“mapred_job_id”变量时,您可能会得到类似以下内容的信息:“job_201302272236_0001”。您可以获取该作业ID的最后一部分,即“0001”。

使用此功能,您可以为reducer输出的每一行构造一个前缀。例如,如果您知道每个 reducer 最多输出1000条线,则该 reducer 的输出可以为1000-1999。第二个 reducer 的作业ID为“job_201302272236_0002”,因此需要2000-2999。

使用Python(Hadoop流)的上述算法的示例代码:

import os, sys
jobID = os.environ['mapred_job_id']
reducerID = jobID.split("_")[-1]

count = 0
for line in sys.stdin: 
  print str((reducerID*NUM)+count) + "," + line
  count += 1

关于hadoop - 使用Map Reduce生成序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17789435/

相关文章:

json - Presto unnest json

hadoop - Hive查询运行的Reducer过多

java - Java Mapreduce 中的驱动程序类错误

node.js - MongoDB 使用 Map/Reduce 将一个字段合并到现有集合中

hadoop - 输入格式决定

hadoop - Map中的SQL建模精简

Maven - 测试中的不同依赖版本

python-2.7 - 执行命令“OSError: [Errno 8] Exec format error”时“ambari-server setup”

hadoop - 如何在命令行上运行PigUnit

hadoop - Mapreduce 中可以用combiner 代替reduce 吗?