2014-07-17 17 views
6

Tôi có tệp ở định dạng hdfs được phân phối trên các nút trong cụm.Lấy mẫu một tập dữ liệu phân tán lớn bằng pyspark/spark

Tôi đang cố lấy mẫu ngẫu nhiên gồm 10 dòng từ tệp này.

trong vỏ pyspark, tôi đọc các tập tin vào một RDD sử dụng:

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

và sau đó tôi muốn chỉ đơn giản là lấy một mẫu ... điều thú vị về Spark là có lệnh như takeSample, tiếc là tôi nghĩ tôi đang làm một cái gì đó sai vì sau mất một thời gian rất dài:

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

vì vậy tôi cố gắng tạo ra một phân vùng trên mỗi nút, và sau đó hướng dẫn mỗi nút để lấy mẫu phân vùng đó bằng cách sử dụng lệnh sau:

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

nhưng điều này mang lại một lỗi ValueError: too many values to unpack:

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 

Làm thế nào tôi có thể lấy mẫu 10 dòng từ một dữ liệu phân phối lớn thiết lập sử dụng tia lửa hoặc pyspark?

+0

Tôi không nghĩ rằng đây là vấn đề với tia lửa, hãy xem http://stackoverflow.com/questions/7053551/python-valueerror-too-many-values-to-unpack – aaronman

+0

@aaronman bạn chính xác trong có nghĩa là lỗi "quá nhiều giá trị" chắc chắn là lỗi python. Tôi sẽ thêm nhiều chi tiết hơn về thông báo lỗi. Linh cảm của tôi là có điều gì đó sai với mã pyspark của tôi mặc dù - bạn có thể chạy mã này thành công trên thiết lập tia lửa của bạn? – mgoldwasser

+1

Tôi chỉ thực sự sử dụng API scala spark, tôi nghĩ rằng phong cách chức năng của scala phù hợp thực sự tốt với Mapreduce nói chung – aaronman

Trả lời

11

Sử dụng mẫu thay vì takeSample dường như làm cho mọi việc một cách hợp lý nhanh:

textFile.sample(False, .0001, 12345) 

vấn đề với điều này là thật khó để biết phần quyền lựa chọn, trừ khi bạn có một ý tưởng sơ bộ số hàng trong tập dữ liệu của bạn.

21

Hãy thử sử dụng textFile.sample(false,fraction,seed) để thay thế. takeSample thường sẽ rất chậm vì nó calls count() on the RDD. Nó cần phải làm điều này bởi vì nếu không nó sẽ không mất đồng đều từ mỗi phân vùng, về cơ bản nó sử dụng số cùng với kích thước mẫu bạn yêu cầu để tính toán phần và gọi sample nội bộ. sample nhanh vì nó chỉ sử dụng một trình tạo boolean ngẫu nhiên trả về đúng fraction phần trăm thời gian và do đó không cần phải gọi count.

Ngoài ra, tôi không nghĩ rằng điều này đang xảy ra với bạn nhưng nếu kích thước mẫu trả về không đủ lớn, nó gọi lại là sample. Vì bạn nên có một số ý tưởng về kích thước của dữ liệu của bạn tôi sẽ khuyên bạn nên gọi mẫu và sau đó cắt mẫu xuống kích thước chính mình, vì bạn biết thêm về dữ liệu của bạn hơn so với tia lửa.

+0

Đây là một chút lạ. Đếm không phải là một hoạt động chậm - Đó là ~ 2 đơn đặt hàng của cường độ nhanh hơn takeSample, cho thấy đây không phải là vấn đề cốt lõi. – nbubis

Các vấn đề liên quan