web-dev-qa-db-fra.com

Comment fonctionne le pyspark mapPartitions?

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.

14
MetallicPriest

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

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)
21
Narek

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)
0
Ravinder Karra