2014-11-04 15 views
11

Próbuję nauczyć się Sparka używając Pythona (Pyspark). Chcę wiedzieć, jak działa ta funkcja. To, co Input bierze i jaki wynik daje. Nie mogłem znaleźć odpowiedniego przykładu z internetu. Powiedzmy, mam obiekt RDD zawierający listy, takie jak poniżej.Jak działa funkcja Pyspark mapPartitions?

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

I chcę, aby usunąć element 2 ze wszystkich list, jaki chciałbym osiągnąć stosując mapPartitions.

Odpowiedz

17

mapPartycja powinna być traktowana jako operacja mapowa na partycjach, a nie na elementach partycji. Jego wejście jest zbiorem aktualnych partycji, a jego wyjście będzie kolejnym zbiorem partycji.

Funkcja zdać mapa musi mieć indywidualny element swojej RDD

funkcji, którą przechodzą mapPartition musi brać iterowalny swojego rodzaju RDD i powrócić i iterable jakiegoś innego lub tego samego typu.

W twoim przypadku prawdopodobnie po prostu chcesz zrobić coś takiego

def filterOut2(line): 
    return [x for x in line if x != 2] 

filtered_lists = data.map(filterOut2) 

jeśli chcesz skorzystać mapPartition byłoby

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) 
+0

Dlaczego nie zwrócisz niczego w filterOut2FromPartition f namaszczenie. Po drugie, czy jest jakieś słowo kluczowe w pythonie? Myślę, że chciałeś powiedzieć final.iterator = [] zamiast final_iterator. – MetallicPriest

+0

Naprawiono problemy – bearrito

+0

Próbowałem zaimplementować to, ale dostaję błąd "obiekt listy nie jest iteratorem". Myślę również, że kiedy napisałeś [x dla x w linii, jeśli x! = 2], myślę, że chodziło ci o [x dla x na liście, jeśli x! = 2]. Użyłem tam listy. – MetallicPriest

18

Łatwiej jest użyć mapPartitions z funkcją generatora pomocą yield składnia:

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

filtered_lists = data.mapPartition(filter_out_2) 
+0

Czy jest to szybsze niż samo zwracanie listy? – cgreen

+1

@ cgreen Partycja zawiera wszystkie twoje dane. Nie jestem pewien, czy chcesz załadować wszystkie swoje dane do listy. Generatory są preferowane nad listami podczas iteracji danych. – Narek

+0

@cgreen Generatory zużywają mniej pamięci, ponieważ generują każdy element w razie potrzeby, zamiast początkowo generować całą listę obiektów. Więc zdecydowanie zużywa mniej pamięci i dlatego jest prawdopodobnie szybszy. [Tutaj jest dobre wytłumaczenie generatorów w Pythonie] (https://medium.freecodecamp.org/python-list-comprehensions-vs-generator-expressions-cef70ccb49db). –