我们目前有一个包含数百万个实体的appengine app(java)。我们使用map reduce framework + cron来为仪表板等提供大量报告。
但是,我们希望能够在整个数据集上运行adhoc查询。我们现在这样做的方法是编写mapreduce,deploy,run mapreduce,查看结果。我们不想进行部署步骤。也就是说,只需转到一些管理界面,指定我们的查询,也许还有一些自定义代码进行后期处理,然后查看结果。如果我们不必每次都进行部署,我们会进行更多的临时查询。
有人做过这样的事吗?你学到了什么?有什么好的策略吗?
答案 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
并向其传递一些过滤器。