2

如何将MapReduce结果写回数据存储?我的第一个想法是“DatastoreOutputWriter”,但显然没有这样的事情。有没有像DatastoreOutputWriter的东西?

澄清:问题不在于修改/保存实体。相反,我想处理它们,并将处理后的结果(不同类型的实体)存储在数据存储区中。

示例:每隔不时计算用户数量,然后将结果保存到包含日期和计数的新实体中。

回答

4

InputReader的目的通常是将作业分成每个实体的任务。您通常会编写处理程序来处理通过相应实体的每个任务。

由于您只需在任务中写入实体,您并不需要DatastoreOutputWriter。 mapreduce lib有一些工具,通过使用async Puts使它更高效一些。建议使用它们,但不使用它们的代码仍然可以使用。这里有一个非常简单的处理程序,它会做一些小的修改,并将实体写回映射阶段:

def addNewAttribute(entity, *args, **kwargs): 
    try: 
     if not entity.get("newattribute"): 
      entity["newattribute"] = False 
      yield op.db.Put(entity) # save the entity back to datastore 
      yield op.counters.Increment("touched") # use mapreduce counter to track operations 
    except: 
     yield op.counters.Increment("touchFail") 
+0

谢谢,但我不想修改相同的实体。而是我想要处理它们,并将处理结果保存到数据存储区。看到澄清的问题。 – pipacs 2013-05-08 15:19:16

+0

重新阅读dragonx的答案:我想我可以使用op.db.Put从reducer写入数据存储区。 – pipacs 2013-05-09 08:51:15