2014-07-17 33 views
6

Kümedeki düğümler arasında dağıtılan bir dosya var.pyspark/spark kullanarak geniş bir dağıtılmış veri kümesini örnekleme

Bu dosyadan 10 satırlık rasgele bir örnek almaya çalışıyorum. pyspark kabuğunda

, ben kullanarak bir RDD dosyayı okuyun:

>>> textFile = sc.textFile("/user/data/myfiles/*") 

ve sonra ben sadece bir örnek almak istiyorum ... Kıvılcım hakkında serin şey komutları takeSample gibi olmasıdır,

>>> textFile.takeSample(False, 10, 12345) 

yüzden aşağıdaki komutu kullanarak bu bölümü örnek her düğümünde bir bölüm oluşturarak ve ardından her düğüm talimat çalıştı: ne yazık ki şu gerçekten çok uzun zaman alır, çünkü ben yanlış bir şey yapıyorum düşünüyorum

>>> textFile.partitionBy(4).mapPartitions(lambda blockOfLines: blockOfLines.takeSample(False, 10, 1234)).first() 

ama bu bir hata ValueError: too many values to unpack veriyor:

org.apache.spark.api.python.PythonException: Traceback (most recent call last): 
    File "/opt/cloudera/parcels/CDH-5.0.2-1.cdh5.0.2.p0.13/lib/spark/python/pyspark/worker.py", line 77, in main 
    serializer.dump_stream(func(split_index, iterator), outfile) 
    File "/opt/cloudera/parcels/CDH-5.0.2-1.cdh5.0.2.p0.13/lib/spark/python/pyspark/serializers.py", line 117, in dump_stream 
    for obj in iterator: 
    File "/opt/cloudera/parcels/CDH-5.0.2-1.cdh5.0.2.p0.13/lib/spark/python/pyspark/rdd.py", line 821, in add_shuffle_key 
    for (k, v) in iterator: 
ValueError: too many values to unpack 

nasıl büyük bir dağıtık verilerden 10 satır tadabilirsiniz kıvılcım veya pyspark kullanılarak ayarlanan?

+0

Bunun kıvılcımla ilgili bir sorun olduğunu düşünmüyorum, http://stackoverflow.com/questions/7053551/python-valueerror-too-many-values-to-unpack – aaronman

+0

@aaronman adresinde bulabilirsiniz. "çok fazla değer" hatasının kesinlikle bir python hatası olduğunu hissedin. Hata mesajı hakkında daha fazla ayrıntı ekleyeceğim. Önsezim pyspark kodumda yanlış bir şey olsa da - bu kodu kıvılcım düzeninizde başarılı bir şekilde çalıştırabiliyor musunuz? – mgoldwasser

+1

Sadece gerçekten scala kıvılcım API'sini kullanıyorum, scala'nın fonksiyonel stilinin Mapreduce'a çok iyi uyduğunu düşünüyorum. – aaronman

cevap

11

yerine takeSample örneği oldukça hızlı şeyleri yapmak görünmektedir kullanma:

textFile.sample(False, .0001, 12345) 

bu sorun size satır sayısında bir fikir olmadığı sürece seçme hakkı kısmını bilmek zor olmasıdır veri kümeniz.

21

Bunun yerine textFile.sample(false,fraction,seed) kullanmayı deneyin. takeSample genellikle çok yavaş olacaktır, çünkü calls count() on the RDD. Bunu yapmak gerekir çünkü aksi takdirde her bölümden eşit olarak alınmazdı, temel olarak, kesir hesaplamak için istediğiniz örnek büyüklüğü ile birlikte sayımı kullanır ve dahili olarak sample'u çağırır. sample hızlıdır, çünkü o zamanın gerçek fraction değerini döndüren ve dolayısıyla count'u aramasına gerek olmayan rastgele bir boole jeneratörü kullanır. Ayrıca, bunun sizin için olduğunu düşünmüyorum ama eğer geri gönderilen örnek boyutu yeterince büyük değilse, sample'u tekrar çağırır ve bu da açıkça yavaşlatabilir. Verilerinizin boyutu hakkında bir fikre sahip olmanız gerektiğinden, örneklemi çağırmanızı ve daha sonra verilerinizi kendinizinkine göre kestirmenizi öneririz.

+0

Bu biraz garip. Sayma, yavaş bir işlem değildir - Bu, çekirdeğin asıl meselesi olmadığını öne süren, ~ 2 sırasını daha büyüktür. – nbubis

İlgili konular