2014-11-04 4 views
11

Bu yüzden Spark'i Python (Pyspark) kullanarak öğrenmeye çalışıyorum. mapPartitions işlevinin nasıl çalıştığını bilmek istiyorum. Girdiğin şey budur ve ne çıktı verir. İnternetten uygun bir örnek bulamadım. Diyelim ki, aşağıdaki gibi bir liste içeren bir RDD nesnesine sahibim.pyspark mapPartitions işlevi nasıl çalışır?

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

Ve ben tüm listelerden eleman 2 kaldırmak istediğiniz, nasıl mapPartitions kullanarak Bunu başarmak olacaktır.

cevap

17

mapPartition, bölümlerin öğeleri üzerinde değil, bölümler üzerinde bir harita işlemi olarak düşünülmelidir. Giriş, mevcut bölümlerin kümesidir, çıktısı başka bir bölüm kümesi olacaktır.

Eğer harita mapPartition senin RDD türünde bir iterable almalıdır geçmesi için RDD

fonksiyonu tek bir öğesine almak ve diğer bazı veya aynı tipte dönmek ve iterable gerekir geçmesi işlevi. Senin durumunda

muhtemelen sadece bu yield kullanarak bir jeneratör işlevi ile mapPartitions kullanımı daha kolay

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

Neden filterOut2FromPartition f öğesinde bir şey döndürmüyorsunuz? unction. İkincisi, python'da bir kaç anahtar kelime var mı? Final_iterator yerine final.iterator = [] demek istediniz. – MetallicPriest

+0

Sorunları düzeltildi – bearrito

+0

Bunu uygulamaya çalıştım ancak "liste nesnesi bir yineleyici değil" hatasını alıyorum. Ayrıca, [x için x için x için x! = 2] yazdığınız zaman, sanırım x [x = 2] durumunda x için x anlamına geldiğinizi düşünüyorum. Orada liste kullandım. – MetallicPriest

18

olurdu Eğer mapPartition kullanmak istiyorsa

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

filtered_lists = data.map(filterOut2) 

gibi bir şey yapmak istiyorum sözdizimi:

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

filtered_lists = data.mapPartition(filter_out_2) 
+0

Bu sadece bir listeyi döndürmekten daha mı hızlı? – cgreen

+1

@cgreen bölümü, tüm verilerinizi içerir. Tüm verilerinizi bir listeye yüklemek istediğinizden emin değilim. Veriler üzerinde yineleme yaparken, listeler üzerinde jeneratörler tercih edilir. – Narek

+0

@cgreen Jeneratörler, başlangıçta tüm bir nesne listesi oluşturmak zorunda kalmadan, her öğeyi gerektiğinde oluşturdukları için daha az bellek kullanır. Yani kesinlikle daha az bellek kullanır ve bu nedenle muhtemelen daha hızlıdır. [Python'daki jeneratörler hakkında iyi bir açıklama] (https://medium.freecodecamp.org/python-list-comprehensions-vs-generator-expressions-cef70ccb49db). –