だから私はSparkを使用してPython(Pyspark)を学ぼうとしている。関数mapPartitions
がどのように機能するかを知りたい。インターネットから適切な例を見つけることができませんでした。たとえば、以下のようなリストを含むRDDオブジェクトがあります。
[ [1, 2, 3], [3, 2, 4], [5, 2, 7] ]
そして、すべてのリストから要素2を削除したいのですが、どのようにmapPartitions
を使用してそれを実現しますか。
mapPartitionは、パーティションの要素ではなく、パーティションに対するマップ操作と考える必要があります。入力は現在のパーティションのセットであり、出力は別のパーティションのセットになります。
Mapに渡す関数は、RDDの個々の要素を取る必要があります
MapPartitionを渡す関数は、RDDタイプの反復可能オブジェクトを取り、他のまたは同じタイプの反復可能オブジェクトを返さなければなりません。
あなたの場合は、おそらく次のようなことをしたいだけです
def filter_out_2(line):
return [x for x in line if x != 2]
filtered_lists = data.map(filterOut2)
mapPartitionを使用する場合は、次のようになります
def filter_out_2_from_partition(list_of_lists):
final_iterator = []
for sub_list in list_of_lists:
final_iterator.append( [x for x in sub_list if x != 2])
return iter(final_iterator)
filtered_lists = data.mapPartition(filterOut2FromPartion)
yield
構文を使用して、ジェネレーター関数でmapPartitionsを使用する方が簡単です。
def filter_out_2(partition):
for element in partition:
if element != 2:
yield element
filtered_lists = data.mapPartitions(filter_out_2)
最終的なIterが必要
def filter_out_2(partition):
for element in partition:
sec_iterator = []
for i in element:
if i!= 2:
sec_iterator.append(i)
yield sec_iterator
filtered_lists = data.mapPartitions(filter_out_2)
for i in filtered_lists.collect(): print(i)