Utiliser la pagination avec l'API BigQuery
Ce document explique comment lire les données de table et les résultats de requête dans de grands ensembles de données en utilisant la pagination avec l'API BigQuery.
Avec la pagination, BigQuery divise un grand ensemble de données en plus petits blocs appelés pages. Pour la plupart des utilisateurs, les bibliothèques clientes Cloud gèrent ce processus automatiquement. Toutefois, vous pouvez également contrôler manuellement la pagination pour des cas d'utilisation spécifiques, comme les applications Web.
Utiliser la pagination automatique
Les bibliothèques clientes Cloud gèrent les détails de bas niveau de la pagination des API et offrent une expérience semblable à celle d'un itérateur. Lorsque vous parcourez les résultats, la bibliothèque récupère automatiquement la page de données suivante si nécessaire.
Les exemples suivants montrent comment parcourir automatiquement les données d'une table BigQuery.
C#
Avant d'essayer cet exemple, suivez les instructions de configuration pour C# du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour C#.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Go
Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Go.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Java
Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Node.js
Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Node.js.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
PHP
Avant d'essayer cet exemple, suivez les instructions de configuration pour PHP du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour PHP.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Python
Avant d'essayer cet exemple, suivez les instructions de configuration pour Python du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Python.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Ruby
Avant d'essayer cet exemple, suivez les instructions de configuration pour Ruby du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Ruby.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Contrôler la taille de la page
Vous pouvez spécifier le nombre maximal de lignes renvoyées dans chaque requête réseau en définissant une taille de page. Définir la taille de la page est utile pour optimiser l'utilisation du réseau ou adapter les données à la mémoire.
Dans la plupart des bibliothèques clientes, vous pouvez utiliser un paramètre max_results ou page_size lorsque vous appelez des méthodes telles que list_rows ou query.
Utiliser la pagination manuelle avec des jetons de page
La pagination manuelle est utile pour les applications sans état, comme un service Web où un utilisateur clique sur Suivant pour afficher l'ensemble de résultats suivant. Dans ce scénario, le serveur ne conserve pas d'itérateur actif entre les requêtes.
À la place, vous utilisez un jeton de page comme suit :
- Demandez une page.Appelez l'API et recevez un paramètre
pageTokenavec les lignes. - Reprends la lecture. Dans la requête suivante, transmettez le même paramètre
pageTokenà BigQuery pour récupérer le prochain bloc de données.
Les exemples suivants montrent comment récupérer un jeton de page et l'utiliser pour extraire la page suivante des résultats de la requête.
API
Lisez le champ jobs.config.query.destinationTable pour déterminer la table dans laquelle les résultats de la requête ont été écrits.
Appelez la méthode tabledata.list pour lire les résultats de la requête.
Java
Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Pour définir le nombre de lignes renvoyées sur chaque page, utilisez une tâche GetQueryResults et définissez l'option pageSize sur l'objet QueryResultsOption que vous transmettez, comme illustré dans l'exemple suivant :
TableResult result = job.getQueryResults();
QueryResultsOption queryResultsOption = QueryResultsOption.pageSize(20);
TableResult result = job.getQueryResults(queryResultsOption);
Node.js
Avant d'essayer cet exemple, suivez les instructions de configuration pour Node.js du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Node.js.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Python
La méthode QueryJob.result renvoie un itérable des résultats de la requête. Par ailleurs,
- Lisez la propriété
QueryJob.destination. Si cette propriété n'est pas configurée, elle est définie par l'API sur une référence à une table anonyme temporaire. - Obtenez le schéma de la table avec la méthode
Client.get_table. - Créez un itérable sur toutes les lignes de la table de destination à l'aide de la méthode
Client.list_rows.
Avant d'essayer cet exemple, suivez les instructions de configuration pour Python du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Python.
Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.
Optimiser avec les ETags
Lorsque vous exécutez une pagination en arrière ou que vous accédez à des pages arbitraires en utilisant les valeurs pageToken mises en cache, il est possible que les données de vos pages aient été modifiées depuis la dernière consultation. Pour limiter ce problème, vous pouvez utiliser la propriété etag.
Toutes les méthodes collection.list (sauf Tabledata) renvoient une propriété etag dans le résultat. Cette propriété est un hachage des résultats de la page, qui permet de vérifier si la page a été modifiée depuis la dernière requête. Lorsque vous adressez à BigQuery une requête contenant une valeur ETag, BigQuery compare cette valeur à la valeur ETag renvoyée par l'API et répond en fonction de la correspondance entre les deux valeurs. Vous pouvez utiliser les ETag pour éviter les appels de liste redondants comme suit :
- Pour renvoyer des valeurs uniquement si elles ont changé, effectuez un appel de liste avec un ETag précédemment stocké à l'aide de l'en-tête HTTP
If-None-Match. Si les ETag correspondent, BigQuery renvoie un code d'étatHTTP 304 Not Modifiedet aucune donnée, ce qui permet d'économiser de la bande passante. - Pour renvoyer des valeurs uniquement si elles n'ont pas changé, utilisez l'en-tête HTTP
If-Match. BigQuery renvoie un code412 Precondition Failedsi la page a été modifiée.
Référence : limites et critères des API
Toutes les méthodes *collection*.list renvoient des résultats paginés sous certaines conditions. La propriété maxResults limite le nombre de résultats par page.
| Méthode | Critères de pagination | Limite maxResults par défaut |
Limite maximale de maxResults |
Limite maximale de maxFieldValues |
|---|---|---|---|---|
tabledata.list |
Renvoie des résultats paginés si la réponse est d'une taille supérieure à 10 Mo1 de données ou contient un nombre de lignes supérieur à maxResults. |
Illimité | Illimité | Illimité |
Toutes les autres méthodes *collection*.list |
Renvoie des résultats paginés si le nombre de lignes de la réponse est supérieur à maxResults et inférieur aux limites maximales. |
10 000 | Illimité | 300 000 |
Si le résultat dépasse la limite d'octets ou de champs, il est tronqué pour respecter la limite. Si une ligne est supérieure à la limite d'octets ou de champ définie, la méthode tabledata.list peut renvoyer jusqu'à 100 Mo de données1, ce qui est conforme à la limite maximale de taille de ligne pour les résultats de requête.
Il n'existe pas de taille minimale par page, et certaines pages peuvent renvoyer plus de lignes que d'autres.
La méthode d'API REST jobs.getQueryResults peut renvoyer 20 Mo de données, sauf si vous demandez explicitement un volume supérieur auprès de l'assistance.
1 La taille des lignes est approximative, car elle est basée sur la représentation interne des données de ligne. La limite maximale de taille de ligne est appliquée à certaines étapes de l'exécution de la tâche de requête.