2014-04-29 17 views
25

Tôi vừa phát hiện ra rằng hàm RAND(), trong khi không có giấy tờ, hoạt động trong BigQuery. Tôi đã có thể tạo ra một (dường như) mẫu ngẫu nhiên gồm 10 từ từ dataset Shakespeare sử dụng:Lấy mẫu ngẫu nhiên trong Google BigQuery

SELECT word FROM 
(SELECT rand() as random,word FROM [publicdata:samples.shakespeare] ORDER BY random) 
LIMIT 10 

Câu hỏi của tôi là: Có bất kỳ bất lợi cho việc sử dụng phương pháp này thay cho HASH() phương pháp được định nghĩa trong " Ví dụ nâng cao "phần của hướng dẫn tham khảo? https://developers.google.com/bigquery/query-reference

Trả lời

36

Tìm công việc tốt :). Tôi đã yêu cầu chức năng gần đây, nhưng nó vẫn chưa đưa nó vào tài liệu.

Tôi cho rằng lợi thế của RAND() là kết quả sẽ thay đổi, trong khi HASH() sẽ tiếp tục cho bạn kết quả tương tự cho cùng giá trị (không được đảm bảo theo thời gian, nhưng bạn có ý tưởng).

Trong trường hợp bạn muốn thay đổi mà RAND() mang lại trong khi vẫn nhận được kết quả nhất quán - bạn có thể gộp nó bằng một số nguyên, như trong RAND (3).

Lưu ý rằng ví dụ bạn dán được thực hiện đầy đủ các giá trị ngẫu nhiên - cho các đầu vào đủ lớn, cách tiếp cận này sẽ không mở rộng.

Một cách tiếp cận khả năng mở rộng, để có được khoảng 10 hàng ngẫu nhiên:

SELECT word 
FROM [publicdata:samples.shakespeare] 
WHERE RAND() < 10/164656 

(nơi 10 là số gần đúng của kết quả tôi muốn nhận được, và 164.656 số hàng mà bảng có)

+1

Hi Felipe! Bạn có thể giải thích những gì bạn đang làm với 'WHERE RAND() <10/164656'? Cảm ơn! – Rohit

+1

RAND() cho tôi một số ngẫu nhiên từ 0 đến 1. Vì vậy, nếu tôi yêu cầu một tập hợp các số ngẫu nhiên, chỉ khoảng một phần mười số đó sẽ nhỏ hơn 0,1, chỉ khoảng một phần trăm trong số đó sẽ nhỏ hơn 0,01 và Sớm. Bảng Shakespeare có 164656 hàng. Nếu tôi chỉ muốn có khoảng 1 hàng ngẫu nhiên, tôi sẽ cho mỗi hàng một số ngẫu nhiên, và chọn một số với nó <1/164656. Nó không đảm bảo rằng sẽ có một - nhưng vẫn còn. 10? 10 * 1/164656 = 10/164656. Hãy thử nó :). –

+0

@ FelipeHoffa Tôi đang cố gắng triển khai phương pháp của bạn, nhưng tôi nhận được kết quả cực kỳ khác biệt. Tôi có một bảng khoảng 6 tỷ hàng và sau khi tôi lấy mẫu bằng cách sử dụng ví dụ: 'rand() <0,004', tỷ lệ cỡ mẫu trên tổng số hàng xuất hiện dưới dạng' 0.0002'. Nói cách khác, mẫu của tôi nhỏ hơn khoảng 20 lần so với dự kiến. Bạn có lời giải thích cho hành vi này không? – Kris

4

Điều tuyệt vời khi biết RAND() khả dụng!

Trong trường hợp của tôi, tôi cần kích thước mẫu được xác định trước. Thay vì cần phải biết tổng số hàng và làm kích thước mẫu bộ phận trên tổng hàng, tôi đang sử dụng các truy vấn sau đây:

SELECT word, rand(5) as rand 
FROM [publicdata:samples.shakespeare] 
order by rand 
#Sample size needed = 10 
limit 10 

Tóm lại, tôi sử dụng ORDER BY + LIMIT để ramdomize và sau đó trích xuất một định nghĩa số lượng mẫu.

0

Một mẹo khác để làm cho nó thậm chí còn đơn giản hơn: Bạn có thể đặt hàng qua các chức năng nó tự, ví dụ:

chọn x từ y trật tự bởi rand() giới hạn 100

=> Mẫu 100

+0

'rand() 'trong' thứ tự bởi' không hoạt động. –

+0

Chính xác. Tuy nhiên, 'select x from (chọn rand() là r, x từ thứ tự y theo giới hạn r 100);' có thể được thừa hưởng. – pcejrowski

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