1

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

谢谢!

4

1 回答 1

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

于 2015-04-13T11:32:37.303 回答