FlatMap
![]() |
コレクション内の各要素に対して、単純な1対多のマッピング関数を適用します。複数の要素は、結果のコレクションにフラット化されます。
例
次の例では、アイコン、名前、および期間を持つ農産物のPCollection
でパイプラインを作成します。次に、FlatMap
を複数の方法で適用して、各入力要素ごとに0個以上の要素を結果のPCollection
に生成します。
FlatMap
はiterable
を返す関数を受け入れます。出力iterable
の各要素は、結果のPCollection
の要素になります。
例1:定義済みの関数を使用したFlatMap
単一のstr
要素を受け取り、str
のlist
を出力する関数str.split
を使用します。このパイプラインは、空白を使用して入力要素を分割し、0個以上の要素のリストを作成します。
例2:関数を使用したFlatMap
デリミター','
を使用して入力str
要素を分割し、str
のlist
を出力する関数split_words
を定義します。
例3:関数を使用しないFlatMap
FlatMap
の一般的なユースケースは、反復可能なPCollection
を要素のPCollection
にフラット化することです。それを行うには、FlatMap
に関数引数を指定しないでください。これにより、IDマッピング関数が使用されます。
例4:ラムダ関数を使用したFlatMap
この例では、str
のリストのPCollection
をstr
のPCollection
にフラット化します。各入力要素はすでにiterable
であり、各要素は結果のPCollection
に必要なものです。受け取ったのと同じ入力要素を返すラムダ関数を使用します。
例5:ジェネレーターを使用したFlatMap
この例では、str
のリストのPCollection
をstr
のPCollection
にフラット化します。ジェネレーターを使用して入力リストを反復処理し、各要素を生成します。ジェネレーターで生成された各結果は、結果のPCollection
の要素になります。
例6:キーと値のペアに対するFlatMapTuple
PCollection
が(キー, 値)
のペアで構成されている場合は、FlatMapTuple
を使用して、それらを異なる関数引数にアンパックできます。
例7:複数の引数を持つFlatMap
複数の引数を持つ関数をFlatMap
に渡すことができます。これらは、追加の位置引数またはキーワード引数として関数に渡されます。
この例では、split_words
は引数としてtext
とdelimiter
を取ります。
例8:シングルトンとしてのサイド入力を持つFlatMap
PCollection
に、別の計算からの平均値など、単一の値がある場合、その値をシングルトンとして渡すと、その値にアクセスできます。
この例では、','
という値をシングルトンとしてPCollection
に渡します。次に、その値をstr.split
メソッドの区切り文字として使用します。
例9:イテレーターとしてのサイド入力を持つFlatMap
PCollection
に複数の値がある場合は、PCollection
をイテレーターとして渡します。これにより、要素が必要に応じて遅延的にアクセスされるため、メモリに収まらない大きなPCollection
を反復処理できます。
注:
beam.pvalue.AsList(pcollection)
を使用してPCollection
をリストとして渡すことができますが、これにはすべての要素がメモリに収まる必要があります。
例10:辞書としてのサイド入力を持つFlatMap
PCollection
がメモリに収まるほど小さい場合は、そのPCollection
を辞書として渡すことができます。各要素は(キー, 値)
のペアである必要があります。これには、PCollection
のすべての要素がメモリに収まる必要があることに注意してください。PCollection
がメモリに収まらない場合は、代わりにbeam.pvalue.AsIter(pcollection)
を使用してください。
関連する変換
- Filter は、関数が要素を出力するかどうかを決定するだけでよい場合に役立ちます。
- ParDo は最も一般的な要素単位のマッピング操作であり、複数の出力コレクションやサイド入力などの機能も含まれています。
- Map は同じように動作しますが、各入力に対して正確に 1 つの出力を生成します。
![]() |
最終更新日: 2024/10/31
お探しの情報はすべて見つかりましたか?
すべて役に立ち、分かりやすかったですか?変更したい点はありますか?ぜひお聞かせください!