2016-12-09 13 views
7

特定のRDDの各パーティションサイズを見つける最も良い方法は何ですか?スパーク:RDDの各パーティションサイズの検索

l = builder.rdd.glom().map(len).collect() # get length of each partition 
print('Min Parition Size: ',min(l),'. Max Parition Size: ', max(l),'. Avg Parition Size: ', sum(l)/len(l),'. Total Partitions: ', len(l)) 

それは小さなRDDSのため正常に動作しますが、大きなRDDSのために、それがOOMエラーを与えている:私は、私はこれを試してみた、歪んだパーティションの問題をデバッグしようとしています。私の考えは、glom()がこれを引き起こしているということです。しかし、とにかく、もっと良い方法があるかどうかを知りたがっていますか?

答えて

10

用途:

builder.rdd.mapPartitions(lambda it: [sum(1 for _ in it)]) 
+1

OPのアプローチが彼のケースでは機能していないと説明することができ、なぜこのアプローチが**働いているのですか? –

8

@LostInOverflowによって答えは偉大な動作しますが。以下のコードを使用して、各パーティションのサイズとインデックスを見つける別の方法を見つけました。私たちは、歪んだパーティションの鍵を見つける

min(l,key=lambda item:item[1]) 
max(l,key=lambda item:item[1]) 

this awesome post.ここ

のおかげでコードです:

l = test_join.rdd.mapPartitionsWithIndex(lambda x,it: [(x,sum(1 for _ in it))]).collect() 

、その後、あなたはこのコードを使用して、最大と最小サイズのパーティションを得ることができます必要に応じて、そのパーティションの内容をさらにデバッグすることができます。