2014-04-29 15 views
25

में यादृच्छिक नमूनाकरण मैंने अभी पाया है कि रैंड() फ़ंक्शन, जबकि अनियंत्रित, BigQuery में काम करता है।Google BigQuery

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

मेरा प्रश्न है: क्या कोई विधि हैश() में परिभाषित के बजाय इस दृष्टिकोण का उपयोग करने के लिए किसी भी नुकसान "मैं का उपयोग कर एक (प्रतीत होता है) शेक्सपियर डाटासेट से 10 शब्दों के नमूने के तौर पर उत्पन्न करने में सक्षम था संदर्भ मैनुअल के उन्नत उदाहरण "खंड? https://developers.google.com/bigquery/query-reference

उत्तर

36

अच्छी नौकरी इसे ढूंढना :)। मैंने हाल ही में समारोह का अनुरोध किया है, लेकिन इसने इसे अभी तक दस्तावेज़ीकरण में नहीं बनाया है।

मैं कहूंगा कि रैंड() का लाभ यह है कि परिणाम अलग-अलग होंगे, जबकि HASH() आपको समान मानों के लिए समान परिणाम देगा (समय के साथ गारंटी नहीं है, लेकिन आपको विचार मिलता है)।

यदि आप लगातार परिणाम प्राप्त करते समय रैंड() लाता है तो भिन्नता चाहते हैं - आप इसे एक पूर्णांक के साथ बीज कर सकते हैं, जैसा कि रैंड (3) में है।

ध्यान दें कि आपके द्वारा चिपकाया गया उदाहरण यादृच्छिक मूल्यों का एक पूर्ण प्रकार कर रहा है - पर्याप्त रूप से बड़े इनपुट के लिए यह दृष्टिकोण स्केल नहीं करेगा।

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

(जहां 10 परिणाम मैं प्राप्त करना चाहते हैं की अनुमानित संख्या है, और 164,656 पंक्तियों की संख्या तालिका है)

:

एक स्केलेबल दृष्टिकोण, लगभग 10 यादृच्छिक पंक्तियां प्राप्त करने के

+1

हाय फ़ेलिप! क्या आप समझा सकते हैं कि आप 'कहां रैंड() <10/164656' के साथ क्या कर रहे हैं? धन्यवाद! – Rohit

+1

रैंड() मुझे 0 और 1 के बीच एक यादृच्छिक संख्या देता है। इसलिए यदि मैं यादृच्छिक संख्याओं के सेट के लिए पूछता हूं, तो उनमें से केवल दसवें स्थान 0.1 से कम होंगे, उनमें से केवल सौवें 0.01 से कम होंगे, और शीघ्र। शेक्सपियर टेबल में 164656 पंक्तियां हैं। अगर मुझे केवल 1 यादृच्छिक पंक्ति चाहिए, तो मैं प्रत्येक पंक्ति को एक यादृच्छिक संख्या दूंगा, और इसके साथ वाले लोगों को <1/164656 चुनें। यह गारंटी नहीं है कि एक होगा - लेकिन फिर भी। 10? 10 * 1/164656 = 10/164656। कोशिश करके देखो :)। –

+0

@FelipeHoffa मैं आपकी विधि को लागू करने की कोशिश कर रहा हूं, लेकिन मुझे जंगली रूप से अलग-अलग परिणाम मिल रहे हैं। मेरे पास लगभग 6 अरब पंक्तियों की एक तालिका है और उदाहरण के बाद नमूनाकरण करने के बाद 'रैंड() <0.004', पंक्तियों की कुल संख्या पर नमूना आकार का अनुपात' 0.0002' के रूप में आता है। दूसरे शब्दों में, मेरा नमूना अपेक्षा से लगभग 20 गुना छोटा है। क्या आपके पास इस व्यवहार के लिए स्पष्टीकरण है? – Kris

4

रैंड() को जानना बहुत अच्छा है!

मेरे मामले में मुझे पूर्वनिर्धारित नमूना आकार की आवश्यकता थी। इसके बजाय पंक्तियों की कुल संख्या को जानते हैं और कुल पंक्तियों पर विभाजन नमूने का आकार नहीं करना पड़ता है, मैं निम्न क्वेरी का उपयोग कर रहा:

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

सारांश, मैं सीमा + द्वारा आदेश का उपयोग ramdomize के लिए और फिर निकाल एक परिभाषित नमूनों की संख्या।

0

एक अतिरिक्त टिप यह और भी आसान बनाने के लिए: आप समारोह में यह स्वयं के द्वारा आदेश कर सकते हैं, यानी:

एक्स y आदेश से चयन रैंड() सीमा 100

=> का नमूना द्वारा 100

+0

'रैंड() '' ऑर्डर 'में काम नहीं करता है। –

+0

सही। हालांकि, 'से एक्स का चयन करें (आर के रूप में रैंड() का चयन करें, आर सीमा 100 से y आदेश से एक्स); 'लीवरेज किया जा सकता है। – pcejrowski

संबंधित मुद्दे