2

特定のキーにマップされたすべてのレコードを処理し、そのデータの複数のレコードを出力する最も簡単な方法は何でしょうか。

たとえば(合成の例)、キーが日付で、値が測定された温度を含む日中のタイムスタンプであると仮定します。気温をその日の最高/平均/最低に分類したいと思います (ここでも、平均から 1 stddev を下回る/上回る)。

出力は、新しい分類による元の温度になります。

Combine.PerKey(CombineFn) を使用すると、 #extractOutput() メソッドを使用してキーごとに 1 つの出力しか許可されません。

ありがとう

4

2 に答える 2

5

CombineFns は、システムが追加の並列化を実行できるようにするため、単一の出力値に制限されます。値の異なるサブセットを個別に結合し、中間結果を任意のツリー削減パターンで結合して、キーごとに単一の結果値が生成されるまで続けます。

キーごとの値がメモリに収まらない (したがって、Jeremy が提案する GroupByKey-ParDo パターンを使用できない) が、計算された統計がメモリに収まる場合は、次のようなこともできます: (1) 結合を使用します。 perKey() を使用して 1 日あたりの統計を計算します (2) View.asIterable() を使用してそれらを PCollectionViews に変換します。(3) 副入力として統計を取得する ParDo を使用して元の入力を再処理します。 (4) その ParDo の DoFn で、startBundle() に副入力を取得させ、使用可能な統計に日をマッピングするメモリ内データ構造を構築します。 processElement でルックアップを行います。

于 2014-12-29T05:04:03.520 に答える
1

GroupByKey 操作の後に ParDo を使用しないのはなぜですか? GroupBy は、すべての値を特定のキーでグループ化します。次に ParDo を適用すると、特定のキーですべての値を処理できます。ParDo を使用すると、特定のキーに対して複数の値を出力できます。

あなたの気温の例では、GroupByKey の出力は KV<Integer, Iterable<Float>> の PCollection になります (Integer を使用して気温の Day と Float を表すと仮定しています)。その後、ParDo を適用してこれらの KV をそれぞれ処理できます。KV ごとに、温度を表す Float を反復処理し、最高/平均/最低温度を計算できます。次に、これらの統計を使用して各温度測定値を分類し、分類を表すレコードを出力できます。これは、各日の測定数がメモリに簡単に収まるほど小さいことを前提としています。

于 2014-12-29T00:50:28.640 に答える