2012-02-27 1 views
4

現在、数百万のエンティティを持つappengineアプリ(java)があります。ダッシュボードなどに電力を供給するためにmap reduce framework + cronを使用して多くのレポートを作成します。AppengineのMapReduceを使用した動的クエリ言語

ただし、データセット全体でアドホッククエリを実行できるようにしたいと考えています。私たちが今やっているやり方は、mapreduceの作成、deploy、mapreduceの実行、結果の表示です。デプロイメントを行う必要はありません。つまり、いくつかの管理インターフェイスに行き、私たちのクエリと多分カスタムコードを指定して後処理を行い、その結果を見てください。たびに展開する必要がなければ、もっと複雑なクエリを実行します。

誰もこのようなことをしましたか?何を学びましたか?良い戦略はありますか?

答えて

2

これはPythonの例ですが、私はあなたがJavaでも同じことができると確信しています。フィルタでエンティティを数えたい場合は1つの解決策です。あなたは

は、その後、あなたの mapper_api.pyにあなたはすべてのフィルタを爆発して処理する必要が
- 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 

mapreduce.yamlからフィルタを扱うマッパーを作成することができます。

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とそれにいくつかのフィルタを渡します。

+0

私はあなたがJavaでこれを行うことはできないと思います。データセット全体を反復処理する必要があります。私はこれでうまくいくので、これらのフィルタを文字列として取り込むコードを記述し、エンティティがフィルタに一致するかどうかを動的にコードに変換する必要があります。これは以前に行われていた.... – aloo

関連する問題