2015-09-29 20 views
5

tại sao hàm "mẫu" trên Spark RDD trả về số lượng phần tử khác nhau mặc dù tham số phân số là giống nhau? Ví dụ, nếu mã của tôi là như dưới đây:Làm cách nào để lấy mẫu có kích thước mẫu chính xác trong Spark RDD?

val a = sc.parallelize(1 to 10000, 3) 
a.sample(false, 0.1).count 

Mỗi lần tôi chạy dòng thứ hai của mã nó trả về một số khác không bằng 1000. Thật sự tôi mong đợi để xem 1000 mỗi lần mặc dù 1000 yếu tố có thể khác nhau. Bất cứ ai có thể cho tôi biết làm thế nào tôi có thể nhận được một mẫu với kích thước mẫu chính xác bằng 1000? Cảm ơn nhiều.

+0

http://stackoverflow.com/a/26830575/494526 – rebeling

Trả lời

10

Nếu bạn muốn một mẫu chính xác, hãy thử làm

a.takeSample(false, 1000) 

Nhưng lưu ý rằng điều này trả về một mảng và không phải là một RDD.

Vì lý do tại sao, a.sample(false, 0.1) không trả lại cùng kích thước mẫu: đó là do tia lửa trong nội bộ sử dụng thứ gọi là Bernoulli sampling để lấy mẫu. Đối số fraction không đại diện cho phần nhỏ của kích thước thực của RDD. Nó đại diện cho xác suất của mỗi phần tử trong dân số được chọn cho mẫu, và như wikipedia nói:

Vì mỗi phần tử được xem xét riêng biệt cho mẫu, kích thước mẫu không cố định mà đúng hơn là sau phân phối nhị thức.

Và điều đó về cơ bản có nghĩa là số đó không cố định.

Nếu bạn đặt đối số đầu tiên thành true, thì nó sẽ sử dụng một thứ gọi là Poisson sampling, điều này cũng dẫn đến kích thước mẫu kết quả không xác định.

Cập nhật

Nếu bạn muốn gắn bó với phương pháp sample, bạn có thể có thể chỉ định một xác suất lớn hơn cho các fraction param và sau đó gọi take như trong:

a.sample(false, 0.2).take(1000) 

này nên, hầu hết các thời gian, nhưng không nhất thiết phải luôn luôn, dẫn đến kích thước mẫu là 1000. Điều này có thể hiệu quả nếu bạn có đủ dân số.

+0

Cảm ơn bạn rất nhiều vì đã giải thích. – Carter

1

Một cách khác có thể là lấy mẫu đầu tiên và sau đó tạo RDD. Điều này có thể chậm với bộ dữ liệu lớn.

sc.makeRDD(a.takeSample(false, 1000, 1234)) 
Các vấn đề liên quan