在Appengine上使用MapReduce的动态查询语言

时间:2012-02-27 23:35:22

标签: java google-app-engine mapreduce

我们目前有一个包含数百万个实体的appengine app(java)。我们使用map reduce framework + cron来为仪表板等提供大量报告。

但是,我们希望能够在整个数据集上运行adhoc查询。我们现在这样做的方法是编写mapreduce,deploy,run mapreduce,查看结果。我们不想进行部署步骤。也就是说,只需转到一些管理界面,指定我们的查询,也许还有一些自定义代码进行后期处理,然后查看结果。如果我们不必每次都进行部署,我们会进行更多的临时查询。

有人做过这样的事吗?你学到了什么?有什么好的策略吗?

1 个答案:

答案 0 :(得分:2)

这是一个Python示例,但我很确定你可以用Java做同样的事情。一种解决方案,如果您只是想通过过滤器计算实体。您可以创建一个处理来自mapreduce.yaml

的过滤器的映射器
- name: Query on Actors
  mapper:
    handler: mapper_api.query_process
    input_reader: google.appengine.ext.mapreduce.input_readers.DatastoreInputReader
    params:
    - name: entity_kind
      value: common.models.Actor

    - name: filters
      value: age<27, name=toto

然后在你的mapper_api.py中你必须爆炸并处理每个过滤器:

def query_process(entity):
  ctx = context.get()
  pms = ctx.mapreduce_spec.mapper.params

  filters = pms['filters']

  if match(entity, filters):
    yield op.counters.Increment("matched")

现在在/ mapreduce中,您可以选择映射器Query on Actors并向其传递一些过滤器。