GAE mapreduce:定义作业的参数

时间:2013-03-05 17:08:44

标签: python google-app-engine mapreduce blobstore

我正在摆弄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上找到我的代码。

谢谢!

1 个答案:

答案 0 :(得分:0)

您应该在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标头来自随机位置,而每个分片只是在它完成任务时写入它的输出。因此,您无法可靠地预测写入输出第一行的那个。