我遇到了一个问题,需要在整个文件中生成从1开始的序列号。
例如,假设我有一个BIG文件,如下所示:-
abc,123
abb,111
ccc,122
。。。。。N此类线路的编号
现在我的输出应该如下:-
1,abc,123
2,abb,111
3,ccc,122
。。。。等等。
使用mapreduce这样做的问题是,文件的每个分割都由不同的映射函数并行处理,因此无法维护序列。请不要告诉我用单个减速器来做这件事。我不想使用单个reducer,因为我想使用典型的mapreduce作业并行完成这项工作。那么,有没有什么最好的方法可以使用map reduce来实现这一点呢?
您可以这样做,但有点棘手。您需要使用"mapred_job_id"环境变量,该变量为您提供reducer的作业id。
例如,当您读入"mapred_job_id"变量时,您可能会得到如下内容:"job_201302272236_001"。您可以获取该作业ID的最后一部分,即"0001"。
使用此选项,可以为减速器输出的每一行构造前缀。例如,如果您知道每个减速器最多输出1000行,则可以使该减速器的输出为1000-1999。第二个减速器的作业ID为"job_201302272236_002",因此需要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