我们目前有一个拥有数百万实体的appengine应用程序(java)。我们使用map reduce框架+cron为仪表板等提供强大的功能,进行了大量报告。
但是,我们希望能够在整个数据集上运行即席查询。我们现在这样做的方式是编写一个mapreduce,部署,运行mapreduce,查看结果。我们希望不必执行部署步骤。也就是说,只需转到一些管理界面,指定我们的查询,也许还有一些自定义代码来进行后期处理,然后查看结果。如果不是每次都部署,我们会做更多的即席查询。
有人做过这样的事吗?你学到了什么?有什么好的策略吗?
这是一个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")
因此,现在在/mapdreduce中,您可以选择映射器Query on Actors
并向其传递一些过滤器。