Échantillonnage aléatoire dans Google BigQuery

je viens de découvrir que la fonction RAND (), bien que non documentée, fonctionne à BigQuery. J'ai pu générer un échantillon (apparemment) aléatoire de 10 mots à partir de L'ensemble de données de Shakespeare en utilisant:

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

ma question Est la suivante: y a-t-il des inconvénients à utiliser cette approche au lieu de la méthode HASH() définie dans la section "Exemples avancés" du manuel de référence? https://developers.google.com/bigquery/query-reference

36
demandé sur Pat Myron 2014-04-30 01:17:21

3 réponses

Bon emploi de trouver ça :). J'ai demandé la fonction récemment, mais elle n'est pas encore dans la documentation.

je dirais que L'avantage de RAND() est que les résultats vont varier, alors que HASH() va continuer à vous donner les mêmes résultats pour les mêmes valeurs (pas garanti avec le temps, mais vous avez l'idée).

Dans le cas où vous souhaitez que la variabilité que RAND() apporte, tout en obtenant des résultats cohérents: vous pouvez la graine avec un entier, comme en RAND(3).

Avis bien que l'exemple que vous avez collé fait une sorte complète des valeurs aléatoires - pour des entrées suffisamment grandes cette approche ne sera pas échelle.

Une approche évolutive, pour obtenir autour de 10 lignes aléatoires:

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

(où 10 est le nombre approximatif de résultats que je veux obtenir, et 164656 le nombre de lignes de la table a)


standardSQL mise à jour:

#standardSQL
SELECT word
FROM `publicdata.samples.shakespeare`
WHERE RAND() < 10/164656

ou encore:

#standardSQL
SELECT word
FROM `publicdata.samples.shakespeare`
WHERE RAND() < 10/(SELECT COUNT(*) FROM `publicdata.samples.shakespeare`)
46
répondu Felipe Hoffa 2018-06-10 23:41:49

Bon à savoir RAND() est disponible!

Dans mon cas, j'avais besoin d'un taille d'échantillon prédéfinie. Au lieu d'avoir besoin de connaître le nombre total de lignes et de faire la taille de l'échantillon de division sur le nombre total de lignes, j'utilise la requête suivante:

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

En résumé, J'utilise L'ordre Par + limite pour ramdomiser puis extraire un nombre défini d'échantillons.

5
répondu fernandosjp 2015-11-03 13:17:44

un conseil supplémentaire pour le rendre encore plus simple: vous pouvez commander par la fonction it self, i.e.:

sélectionner x à partir de y order by rand() limite de 100

=> Échantillon de 100

1
répondu Andreas Granström 2017-09-01 11:46:59