パーティション
![]() |
コレクション内の要素を複数の出力コレクションに分割します。パーティション関数は、入力コレクションの要素をそれぞれ結果のパーティション出力コレクションに分割する方法を決定するロジックを含みます。
パーティションの数は、グラフ構築時に決定する必要があります。パイプラインの途中でパーティションの数を決定することはできません。
詳細は、Beamプログラミングガイドをご覧ください。
例
以下の例では、アイコン、名前、期間を持つ農産物の`PCollection`を持つパイプラインを作成します。次に、`Partition`を複数の方法で適用して、`PCollection`を複数の`PCollection`に分割します。
`Partition`は、パーティションの数を受け取り、要素の目的のパーティションのインデックスを返す関数を受け入れます。渡されるパーティションの数は正の整数でなければならず、`0`から`num_partitions-1`の範囲の整数を返す必要があります。
例1:関数によるパーティション
次の例では、既知の期間リストがあります。`PCollection`を、期間タイプごとに1つの`PCollection`にパーティション分割します。
例2:ラムダ関数によるパーティション
ラムダ関数を使用して**例1**を簡略化することもできます。
例3:複数引数によるパーティション
複数引数を持つ関数を`Partition`に渡すことができます。関数の追加の位置引数またはキーワード引数として渡されます。
機械学習では、データをトレーニングデータセットとテストデータセットに分割するのが一般的なタスクです。通常、データの80%はモデルのトレーニングに使用され、20%はテストに使用されます。
この例では、`PCollection`データセットをトレーニングデータセットとテストデータセットに分割します。`plant`要素、`num_partitions`、および追加の引数`ratio`を受け取る`split_dataset`を定義します。`ratio`は、各パーティションに入るアイテムの比率を表す数値のリストです。`num_partitions`は`Partitions`によって位置引数として使用され、`plant`と`ratio`は`split_dataset`に渡されます。
80%/20%の分割が必要な場合は、`[8, 2]`の比率を指定できます。これは、10個の要素ごとに8個が最初のパーティションに、2個が2番目のパーティションに入ることを意味します。各要素を送信するパーティションを決定するために、異なるバケットがあります。この場合、`[8, 2]`には**10**個のバケットがあり、最初の8個のバケットは最初のパーティションを表し、最後の2個のバケットは2番目のパーティションを表します。
まず、比率リストの長さが、渡す`num_partitions`に対応していることを確認します。次に、各要素のバケットインデックスを0から9(`num_buckets-1`)の範囲で取得します。`hash(element) % len(ratio)`を実行できますが、代わりにJSON表現のすべてのASCII文字を合計して、決定論的にします。最後に、比率のすべての要素をループし、実行合計を使用して、そのバケットが対応するパーティションインデックスを識別します。
この`split_dataset`関数は、任意の比率で任意の数のパーティションをサポートするのに十分な汎用性を備えています。データセットに適した、またはランダム化されたハッシュを使用するように、バケット割り当てを調整することができます。
関連する変換
- 関数が要素を出力するかどうかだけを決定している場合は、フィルタが役立ちます。
- ParDoは、最も一般的な要素ごとのマッピング操作であり、複数の出力コレクションやサイド入力などの他の機能も含まれています。
- CoGroupByKeyは、キーごとの等結合を実行します。
![]() |
最終更新日:2024/10/31
お探しのものはすべて見つかりましたか?
すべて役に立ち、明確でしたか?変更したいことはありますか?お知らせください!