2015-11-19 13 views
5

Satırları gerektiğinde yerel olarak toplayabilmem için satırları RDD birimimden tek seferde (veya küçük gruplar halinde) döndürmek istiyorum. RDD'm, isim düğümünde belleğe sığamayacak kadar büyük, bu nedenle collect()'un çalıştırılması bir hataya neden olabilir.pyspark arabelleğinde RDD'yi topla

collect() işlemini yeniden oluşturmak için bir yol var mı, ancak bir jeneratör ile RDD satırları bir arabelleğe geçirilir? Başka bir seçenek, önbelleğe alınmış bir RDD'den gelen bir zamanda take() 100000 satırları olacaktır, ancak take()'un bir başlangıç ​​konumu belirlemenize olanak sağladığını düşünmüyorum?

+1

"saveAsTextFile" den kaçınmak istediğiniz bir şey var mı? Çünkü her şeyi bir dosyaya aktarabilir ve sonra bir tampondan okuyabilirsiniz. –

+0

@ paul-k Şu anda saveAsTextFile kullanıyorum, ancak bunun birkaç sorunu var: 1) okuma zamanı yavaş, çünkü bunlar metin dosyaları ve 2) veri türleri hakkında bilgi kaybediyorum, yani '1' 1 – mgoldwasser

+0

ile aynıdır Bu doğru 2) hala bir sorun ama dosya boyutu açısından çok ekonomik olmasa bile tür bilgisi yazabilirsiniz. nesneleri serileştirmek için SaveAsPickleFile'ı da arayabilirsiniz. 1) Bunun, "topla" uygulamasının gerçek uygulamadan daha yavaş olacağını düşünmüyorum çünkü dokümanlardaki geçici dosyadan okuyor: ps: //spark.apache.org/docs/0.7.2/api/pyspark /pyspark.rdd-pysrc.html#RDD.collect –

cevap

5

Mevcut en iyi seçenek, o anda yalnızca tek bir bölüm toplayan RDD.toLocalIterator kullanmaktır.

rdd = sc.parallelize(range(100000)) 
iterator = rdd.toLocalIterator() 
type(iterator) 

## generator 

even = (x for x in iterator if not x % 2) 

Belirli bir bölümleyici kullanarak ve bir takım bölümlerden ayarlayarak tek partide toplanan verilerin miktarını ayarlayabilirsiniz: Bu standart Python jeneratörü oluşturur.

Maalesef bir fiyatla geliyor. Küçük partileri toplamak için birden fazla Spark işini başlatmanız gerekir ve bu oldukça pahalıdır. Yani genellikle o zaman bir elementi toplamanın bir seçeneği söz konusu değildir.

+0

Sadece küçük bir not eklemek istedim, bu bölüm başına bir liste döndüren bir yineleyici istiyorsanız, 'glom() ile mükemmel çalışır. – numeral