web-dev-qa-db-ja.com

pyspark mapPartitions関数はどのように機能しますか?

だから私はSparkを使用してPython(Pyspark)を学ぼうとしている。関数mapPartitionsがどのように機能するかを知りたい。インターネットから適切な例を見つけることができませんでした。たとえば、以下のようなリストを含むRDDオブジェクトがあります。

[ [1, 2, 3], [3, 2, 4], [5, 2, 7] ] 

そして、すべてのリストから要素2を削除したいのですが、どのようにmapPartitionsを使用してそれを実現しますか。

18
MetallicPriest

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)
25
bearrito

yield構文を使用して、ジェネレーター関数でmapPartitionsを使用する方が簡単です。

def filter_out_2(partition):
    for element in partition:
        if element != 2:
            yield element

filtered_lists = data.mapPartitions(filter_out_2)
24
Narek

最終的な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)
0
Ravinder Karra