2017-10-02 2 views
1

Je lance une requête synchrone SELECT simple dans BigQuery Google à l'aide de la bibliothèque client Python. Je reçois l'erreur suivante:Erreur 403: Réponse trop grande lors de l'exécution des requêtes de synchronisation BigQuery sur la bibliothèque Python

*** google.cloud.exceptions.Forbidden: 403 Response too large to return. Consider setting allowLargeResults to true

J'utilise run_sync_query() à cet effet.

La façon dont je le fais est (décapage des trucs unnecesary):

def run_query(query_str): 
    from google.cloud import bigquery 
    client = biquery.Client() 
    query = client.run_sync_query(query_str) 
    query.run() 
    return query.fetch_data() 

Je sais qu'il existe un paramètre allowLargeResults dans le API documentation mais je ne sais pas comment définir ce paramètre de la bibliothèque client.

Répondre

0

Vous pouvez le configurer comme ceci:

query.allow_large_results = True

https://github.com/GoogleCloudPlatform/google-cloud-python/blob/e716fbef3dc74e8853346426af356bad364f6637/bigquery/google/cloud/bigquery/job.py#L1090

Cependant, si vous définissez allow_large_results alors vous devez également spécifier une table de destination pour écrire les résultats:

https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.query.allowLargeResults

[Optional] If true and query uses legacy SQL dialect, allows the query to produce arbitrarily large result tables at a slight cost in performance. Requires destinationTable to be set. For standard SQL queries, this flag is ignored and large results are always allowed. However, you must still set destinationTable when result size exceeds the allowed maximum response size.

+0

Comment la table de destination est-elle définie spécifiquement dans la bibliothèque Python? – adrpino

+0

Ce truc est assez facile à Google vous-même, mais là vous allez: https://googlecloudplatform.github.io/google-cloud-python/latest/bigquery/usage.html#querying-data-asynchronous –

+0

Ce n'est en fait pas en utilisant une requête de synchronisation, mais appel 'run_async_query()', qui est ce que j'ai fini par utiliser. Ce n'était pas l'option préférée car dans ce cas, vous devez gérer la dénomination des tâches et des tables de destination. J'essayais de le configurer le travail de synchronisation mais AFAIK c'est pas possible. Comme vous pouvez le voir, ce n'était pas une question de savoir comment Google :) – adrpino