2014-04-29 12 views
25

Ich entdeckte gerade, dass die RAND() - Funktion, während undokumentiert, in BigQuery funktioniert. Ich konnte eine (scheinbar) Stichprobe von 10 Wörtern aus dem Shakespeare-Datensatz zu erzeugen, mit:Random Sampling in Google BigQuery

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

Meine Frage ist: Gibt es irgendwelche Nachteile mit diesem Ansatz anstelle des HASH() -Methode definiert in der " Erweiterte Beispiele "Abschnitt des Referenzhandbuchs? https://developers.google.com/bigquery/query-reference

Antwort

36

Gute Arbeit, es zu finden :). Ich habe die Funktion kürzlich angefordert, aber es ist noch nicht zur Dokumentation gekommen.

Ich würde sagen, der Vorteil von RAND() ist, dass die Ergebnisse variieren, während HASH() Ihnen die gleichen Ergebnisse für die gleichen Werte geben wird (nicht garantiert im Laufe der Zeit, aber Sie bekommen die Idee).

Wenn Sie die Variabilität wünschen, die RAND() liefert, während Sie immer noch konsistente Ergebnisse erhalten, können Sie sie wie in RAND (3) mit einer Ganzzahl setzen.

Beachten Sie, dass das Beispiel, das Sie eingefügt haben, eine vollständige Art der zufälligen Werte macht - für ausreichend große Eingaben wird dieser Ansatz nicht skalieren.

Eine skalierbare Ansatz, erhalten rund 10 zufällige Reihen:

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

(wobei 10 die ungefähre Anzahl der Ergebnisse, die ich zu bekommen ist, und 164.656 die Anzahl der Zeilen, die Tabelle hat)

+1

Hallo Felipe! Kannst du erklären, was du mit 'WHERE RAND() <10/164656 'machst? Vielen Dank! – Rohit

+1

RAND() gibt mir eine Zufallszahl zwischen 0 und 1. Also, wenn ich nach einer Reihe von Zufallszahlen frage, nur etwa ein Zehntel von ihnen wird weniger als 0,1, nur etwa ein Hundertstel von ihnen wird weniger als 0,01 und bald. Shakespeare-Tisch hat 164656 Reihen. Wenn ich nur ungefähr eine zufällige Reihe haben möchte, gebe ich jeder Reihe eine zufällige Zahl und wähle die mit ihr <1/164656 aus. Es ist nicht garantiert, dass es einen geben wird - aber trotzdem. 10? 10 * 1/164656 = 10/164656. Versuch es :). –

+0

@FelipeHoffa Ich versuche, Ihre Methode zu implementieren, aber ich bekomme sehr unterschiedliche Ergebnisse. Ich habe eine Tabelle von ungefähr 6 Milliarden Reihen und nachdem ich die Probenahme unter Verwendung z.B. 'rand() <0.004', das Verhältnis der Stichprobengröße zur Gesamtzahl der Zeilen ergibt sich als '0.0002'. Mit anderen Worten, meine Probe ist etwa 20 mal kleiner als erwartet. Haben Sie eine Erklärung für dieses Verhalten? – Kris

4

Gut zu wissen RAND() ist verfügbar!

In meinem Fall brauchte ich eine vordefinierte Stichprobengröße. Statt um die Gesamtanzahl der Zeilen und machen die Teilung Probengröße über insgesamt Reihen wissen, ich die folgende Abfrage verwenden:

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

Summieren, verwende ich ORDER BY LIMIT + ramdomize und dann eine definierte extrahieren Anzahl von Beispielen.

0

Ein weiterer Tipp es noch einfacher zu machen: Sie durch die Funktion es selbst bestellen können, das heißt:

wählen x von y Auftrag von rand() Grenze 100

=> Beispiel von 100

+0

'Rand() 'in' order by' funktioniert nicht. –

+0

Korrekt. Wählen Sie jedoch x aus (wählen Sie rand() als r, x aus der y-Reihenfolge nach r Grenze 100); kann genutzt werden. – pcejrowski