RDDでglom()
メソッドに出くわしました。ドキュメントによると
各パーティション内のすべての要素を配列に結合して作成されたRDDを返します
glom
はパーティション間でデータをシャッフルしますか、それともパーティションデータを配列として返すだけですか?後者の場合、mapPartitions
を使用しても同じことが達成できると思います。
また、glom
の恩恵を受けるユースケースがあるかどうかも知りたいです。
glom
はパーティション間でデータをシャッフルしますか
いいえ、しません
これが2番目のケースである場合、mapPartitionsを使用して同じことが達成できると思います
できる:
rdd.mapPartitions(iter => Iterator(_.toArray))
ただし、map
、flatMap
、filter
などのシャッフル以外の変換にも同じことが当てはまります。
globの恩恵を受けるユースケースがある場合。
複数回トラバース可能な形式でパーティションデータにアクセスする必要がある状況。
glom()
は、各パーティションを要素のタプル(不変リスト)に変換します。タプルのRDD
を作成します。パーティションごとに1つのタプル。
"... Glom()一般に、sparkは、ワーカーがRDDの特定の要素を参照することを許可しません。言語をクリーンに保ちますが、大きな制限になる可能性があります。glom()各パーティションを要素のタプル(不変リスト)に変換します。チュールのRDDを作成します。パーティションごとに1つのタプル。ワーカーはインデックスによってパーティションの要素を参照できます。ただし、要素に値を割り当てることはできません。 RDDはまだ不変です。これで、各パーティションの要素数をカウントするために上記で使用したコマンドを理解できます。glom()
を使用して各パーティションをタプルにします。len
を使用します。タプルの長さを取得するための各パーティション-パーティションのサイズ。*結果をcollect
して出力します。