我正在摆弄GAE mapreduce,有一个问题:
是否有可能在mapreduce中仅为某个作业更改变量?
我问的原因是:
我的mapreduce作业的输入csv和输出csv应该具有相同的标题行-然而,标题行在输出csv的某个地方,但从来没有在顶部。为了获得正确的标题行,我在reduce函数中插入了一个计数器,该计数器检查reduce作业的当前迭代,如果它为0,它将把硬编码的标题行传递给管道。当输出csv存储在blobstore中时,计数器将被重置。
问题:计数器通常会随机重置自己,可能是因为我必须在函数外将其定义为全局变量"reduce_counter = 0"。
是否有任何方法将变量/参数链到作业,或者是否有更好的方法来获取header_row?
我不认为我可以与DictReader或csv模块工作,因为输出存储在blobstore和blobstore对象不能被改变,据我所知。
您可以在main.py文档的www.github.com/jvdheyden/ste中找到我的代码。
谢谢!
应该在mapreduce作业完成后添加标题。可以通过在任务完成后访问输出CSV来实现:
orig_file = gcs.open(filename_from_mapreduce)
new_file = gcs.open(filename_from_mapreduce + "_with_headers", "r")
new_file.write("your,csv,headers,here")
while True:
read = orig_file.read()
if read == '':
break
output.write(read)
output.close()
gcs.delete(orig_file)
你的问题发生是因为GAE在多个分片中处理mapreduce任务。美妙之处在于,这些小任务中的每一个都是并行执行的,这在处理大量数据时为我们提供了巨大的时间优势。
这也解释了为什么你的CSV头出现在随机的地方,而每个分片只是在完成工作时写入它的输出。因此,您无法可靠地预测谁将写出输出的第一行。