【问题标题】:GAE mapreduce: define parameters for jobGAE mapreduce:为作业定义参数
【发布时间】:2013-03-05 17:08:43
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: python google-app-engine mapreduce blobstore


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多