Échantillonnage de table
L'échantillonnage de table vous permet d'interroger des sous-ensembles aléatoires de données provenant de grandes tables BigQuery. L'échantillonnage renvoie divers enregistrements tout en évitant les coûts liés à l'analyse et au traitement d'une table entière.
Utiliser l'échantillonnage de table
Pour utiliser l'échantillonnage de table dans une requête, incluez la
clause
TABLESAMPLE
. Par exemple, la requête suivante sélectionne environ 10 % des données
d'une table :
SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (10 PERCENT)
Contrairement à la clause LIMIT
, TABLESAMPLE
renvoie un sous-ensemble aléatoire de données d'une
table. De plus, BigQuery ne met pas en cache les résultats des requêtes
incluant une clause TABLESAMPLE
. Par conséquent, la requête peut renvoyer des résultats différents à chaque
fois.
Vous pouvez combiner la clause TABLESAMPLE
avec d'autres conditions de sélection. L'exemple
suivant présente environ 50 % de la table, puis applique une clause
WHERE
:
SELECT *
FROM dataset.my_table TABLESAMPLE SYSTEM (50 PERCENT)
WHERE customer_id = 1
L'exemple suivant combine une clause TABLESAMPLE
avec une clause JOIN
:
SELECT *
FROM dataset.table1 T1 TABLESAMPLE SYSTEM (10 PERCENT)
JOIN dataset.table2 T2 TABLESAMPLE SYSTEM (20 PERCENT) USING (customer_id)
Pour les tables plus petites, si vous joignez deux échantillons et qu'aucune des lignes échantillonnées ne remplit la condition de jointure, vous recevrez peut-être un résultat vide.
Vous pouvez spécifier le pourcentage sous la forme d'un paramètre de requête. L'exemple suivant montre comment transmettre le pourcentage à une requête à l'aide de l'outil de ligne de commande bq :
bq query --use_legacy_sql=false --parameter=percent:INT64:29 \
'SELECT * FROM `dataset.my_table` TABLESAMPLE SYSTEM (@percent PERCENT)`
Les tables BigQuery sont organisées en blocs de données. La clause TABLESAMPLE
consiste à sélectionner de manière aléatoire un pourcentage de blocs de données dans la table
et à lire toutes les lignes des blocs sélectionnés. La précision de l'échantillonnage
est limitée par le nombre de blocs de données.
En règle générale, BigQuery divise les tables ou les partitions de tables en blocs
si leur taille est supérieure à environ 1 Go. Les tables plus petites peuvent être constituées d'un seul
bloc de données. Dans ce cas, la clause TABLESAMPLE
lit la table entière. Si
le pourcentage d'échantillonnage est supérieur à zéro et que la table n'est pas vide,
l'échantillonnage de la table renvoie toujours certains résultats.
Les blocs peuvent avoir des tailles différentes, de sorte que la fraction exacte des lignes échantillonnées
peut varier. Si vous souhaitez échantillonner des lignes individuelles plutôt que des blocs de données,
vous pouvez utiliser une clause WHERE rand() < K
à la place. Cependant, cette approche nécessite que
BigQuery analyse l'ensemble de la table. Pour réduire les coûts tout en
bénéficiant de l'échantillonnage au niveau des lignes, vous pouvez combiner ces deux techniques.
L'exemple suivant lit environ 20 % des blocs de données du stockage, puis sélectionne de manière aléatoire 10 % des lignes de ces blocs :
SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (20 PERCENT)
WHERE rand() < 0.1
Tables externes
Vous pouvez utiliser la clause TABLESAMPLE
avec des tables externes qui stockent les données dans un
ensemble de fichiers. BigQuery échantillonne un sous-ensemble des fichiers
externes auxquels la table fait référence. Pour certains formats de fichiers, BigQuery
peut diviser des fichiers individuels en blocs pour l'échantillonnage. Certaines données externes, telles que celles contenues dans Google Sheets, se composent d'un fichier unique échantillonné comme un bloc de données.
Échantillonnage à partir du stockage optimisé en écriture
Si vous utilisez l'échantillonnage de table avec des insertions en flux continu, BigQuery échantillonne les données du stockage optimisé pour l'écriture. Dans certains cas, toutes les données du stockage optimisé en écriture sont représentées sous la forme d'un bloc unique. Dans ce cas, toutes les données stockées dans l'espace de stockage optimisé en écriture apparaissent dans les résultats, ou aucune.
Tables partitionnées et en cluster
Le partitionnement et le clustering produisent des blocs dans lesquels toutes les lignes d'un bloc spécifique ont la même clé de partitionnement ou possèdent des attributs de clustering avec des valeurs proches. Par conséquent, les ensembles d'échantillons de ces tables ont tendance à être plus biaisés que les ensembles d'échantillons de tables non partitionnées et non mises en cluster.
Limites
- Une table échantillonnée ne peut apparaître qu'une seule fois dans une instruction de requête. Cette restriction inclut les tables référencées dans les définitions de vue.
- L'échantillonnage des données à partir des vues n'est pas possible.
- L'échantillonnage des résultats des sous-requêtes ou des appels de fonction de valeur de table n'est pas possible.
- L'échantillonnage dans une sous-requête
IN
n'est pas possible. - L'échantillonnage des tables avec la sécurité au niveau des lignes n'est pas accepté.
Tarifs de l'échantillonnage de table
Si vous utilisez la facturation à la demande,
la lecture des données échantillonnées vous est facturée. BigQuery ne met pas
en cache les résultats d'une requête incluant une clause TABLESAMPLE
. Par conséquent, chaque
exécution engendre des coûts de lecture des données de l'espace de stockage.