J'essaie donc d'apprendre Spark en utilisant Python (Pyspark). Je veux savoir comment fonctionne la fonction mapPartitions
. C’est ce que l’entrée prend et quelle sortie il donne. Je n'ai pas trouvé d'exemple approprié sur Internet. Disons que j'ai un objet RDD contenant des listes, comme ci-dessous.
[ [1, 2, 3], [3, 2, 4], [5, 2, 7] ]
Et je veux supprimer l'élément 2 de toutes les listes, comment pourrais-je atteindre cet objectif en utilisant mapPartitions
.
mapPartition doit être considéré comme une opération de mappage sur des partitions et non sur les éléments de la partition. Son entrée est l'ensemble des partitions actuelles et sa sortie sera un autre ensemble de partitions.
La fonction que vous transmettez à la carte doit prendre un élément individuel de votre RDD
La fonction que vous transmettez à mapPartition doit prendre une valeur itérable de votre type de RDD et renvoyer une valeur itérable de tout autre type ou du même type.
Dans votre cas, vous voulez probablement juste faire quelque chose comme
def filterOut2(line):
return [x for x in line if x != 2]
filtered_lists = data.map(filterOut2)
si vous vouliez utiliser mapPartition, ce serait
def filterOut2FromPartion(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)
Il est plus facile d'utiliser mapPartitions avec une fonction génératrice à l'aide de la syntaxe yield
:
def filter_out_2(partition):
for element in partition:
if element != 2:
yield element
filtered_lists = data.mapPartitions(filter_out_2)
Besoin d'un dernier 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)