web-dev-qa-db-fra.com

Échantillonnage aléatoire dans Google BigQuery

Je viens de découvrir que la fonction Rand (), bien que non documentée, fonctionne dans BigQuery. J'ai pu générer un échantillon (apparemment) aléatoire de 10 mots à partir de l'ensemble de données 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

50
David M Smith

Pour l'échantillonnage stratifié, cochez https://stackoverflow.com/a/52901452/132438


Bon travail pour le trouver :). J'ai récemment demandé la fonction, mais elle n'est pas encore arrivée dans la documentation.

Je dirais que l'avantage de Rand () est que les résultats varieront, tandis que HASH () continuera à vous donner les mêmes résultats pour les mêmes valeurs (non garantis dans le temps, mais vous avez l'idée).

Si vous voulez la variabilité apportée par Rand () tout en obtenant des résultats cohérents - vous pouvez l'amorcer avec un entier, comme dans Rand (3).

Notez cependant que l'exemple que vous avez collé fait une sorte complète de valeurs aléatoires - pour des entrées suffisamment grandes, cette approche ne sera pas mise à l'échelle.

Une approche évolutive, pour contourner 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)


mise à jour standardSQL:

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

ou même:

#standardSQL
SELECT Word
FROM `publicdata.samples.shakespeare`
WHERE Rand() < 10/(SELECT COUNT(*) FROM `publicdata.samples.shakespeare`)
66
Felipe Hoffa

Super de savoir que 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 ORDER BY + LIMIT pour ramdomiser puis extraire un nombre défini d'échantillons.

8
fernandosjp

Un conseil supplémentaire pour le rendre encore plus simple: vous pouvez commander par la fonction elle-même, c'est-à-dire:

sélectionnez x dans l'ordre y par Rand () limite 100

=> Échantillon de 100

2
Andreas Granström