É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.