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 des ensembles de données volumineux à l'aide de la pagination avec l'API BigQuery.
Avec la pagination, BigQuery divise un ensemble de données volumineux en plus petits blocs appelés pages. Pour la plupart des utilisateurs, les bibliothèques clientes Cloud gèrent ce processus automatiquement, mais 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 lorsque cela est nécessaire.
Les exemples suivants montrent comment parcourir automatiquement les données de 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 des pages
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.
Au lieu de cela, vous utilisez un jeton de page comme suit :
- Demandez une page. Appelez l'API et recevez un paramètre
pageTokenavec les lignes. - Reprenez. Dans la requête suivante, transmettez ce même paramètre
pageTokenà BigQuery pour récupérer le bloc de données suivant.
Les exemples suivants montrent comment récupérer un jeton de page et l'utiliser pour récupérer la page de résultats de requête suivante.
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 ETag
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 éviter cela, 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 ne renvoyer des valeurs que 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 ne renvoyer des valeurs que si elles n'ont pas changé, utilisez l'
en-tête
If-MatchHTTP. BigQuery renvoie un message d'erreur412 Precondition Failedsi la page a été modifiée.
Référence : Limites et critères de l'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 maxResults maximale |
Limite maxFieldValues maximale |
|---|---|---|---|---|
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 de l'API REST jobs.getQueryResults peut renvoyer 20 Mo de données, sauf si vous demandez explicitement un volume supérieur via l'assistance.
1 La taille des lignes est approximative, car la taille 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