2015-11-19 19 views
5

Tôi muốn một cách để trả về các hàng từ RDD của tôi tại một thời điểm (hoặc theo lô nhỏ) để tôi có thể thu thập các hàng cục bộ khi tôi cần chúng. RDD của tôi đủ lớn để nó không thể khớp với bộ nhớ trên nút tên, do đó, chạy collect() sẽ gây ra lỗi.thu thập RDD với bộ đệm trong pyspark

Có cách nào để tạo lại hoạt động collect() nhưng với trình tạo, để các hàng từ RDD được chuyển vào bộ đệm không? Một tùy chọn khác sẽ là take() 100000 hàng cùng một lúc từ RDD được lưu trong bộ nhớ cache, nhưng tôi không nghĩ rằng take() cho phép bạn chỉ định vị trí bắt đầu?

+1

Có điều gì khiến bạn muốn tránh "saveAsTextFile" không? Bởi vì bạn có thể tuôn ra mọi thứ vào một tệp và sau đó đọc nó thông qua bộ đệm. –

+0

@ paul-k Tôi hiện đang sử dụng saveAsTextFile, tuy nhiên điều này có một vài vấn đề: 1) thời gian đọc chậm, vì đây là các tệp văn bản và 2) Tôi mất thông tin về kiểu dữ liệu, vì vậy '1' cũng giống như 1 – mgoldwasser

+0

Đó là sự thật 2) vẫn là một vấn đề nhưng bạn vẫn có thể viết thông tin loại mặc dù điều này không phải là rất kinh tế về kích thước tập tin. bạn cũng có thể gọi SaveAsPickleFile để sắp xếp các đối tượng. 1) Tôi không nghĩ rằng điều này sẽ chậm hơn so với việc thực hiện thực tế của 'thu thập' vì nó đọc từ một tập tin tạm thời theo các tài liệu: ps: //spark.apache.org/docs/0.7.2/api/pyspark /pyspark.rdd-pysrc.html#RDD.collect –

Trả lời

5

Tùy chọn có sẵn tốt nhất là sử dụng RDD.toLocalIterator chỉ thu thập một phân vùng duy nhất tại thời điểm đó. Nó tạo trình tạo Python chuẩn:

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

## generator 

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

Bạn có thể điều chỉnh lượng dữ liệu được thu thập trong một đợt bằng cách sử dụng phân vùng cụ thể và điều chỉnh một số phân vùng.

Thật không may, nó đi kèm với một mức giá. Để thu thập các lô nhỏ, bạn phải bắt đầu nhiều công việc Spark và nó khá tốn kém. Vì vậy, nói chung thu thập một yếu tố vào thời điểm đó không phải là một lựa chọn.

+0

Chỉ muốn thêm một ghi chú nhỏ, điều này làm việc tuyệt vời với 'glom()' nếu bạn muốn một iterator trả về một danh sách cho mỗi phân vùng. – numeral

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