我有一个问题,我需要在整个文件中生成从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/