2017-06-15 2 views
0

Ich habe eine Reihe von IDs (~ 200k) und ich muss alle Zeilen in einer BigQuery-Tabelle mit diesen IDs abrufen. Ich habe versucht, eine Liste in Python zu konstruieren und übergeben sie als Parameter an die SQL-Abfrage mit @, aber ich bekomme TypeError: 'ArrayQueryParameter' object is not iterable Fehler. Hier ist der Code Ich habe versucht (sehr ähnlich https://cloud.google.com/bigquery/querying-data#running_parameterized_queries):Übergabe von Array-Parameter an SQL für BigQuery in Python

id_list = ['id1', 'id2'] 
query = """ 
    SELECT id 
    FROM `my-db` 
    WHERE id in UNNEST(@ids) 
""" 
query_job = client.run_async_query(
    str(uuid.uuid4()), 
    query, 
    query_parameters=(
     bigquery.ArrayQueryParameter('ids', 'ARRAY<STRING>', id_list) 
    ) 
) 

Antwort

3

Wahrscheinlich ist das Problem hier, dass Sie kein Tupel an die Funktion übergeben.

Versuchen ein Komma vor dem Schließen der Klammer hinzufügen, etwa so:

id_list = ['id1', 'id2'] 
query = """ 
    SELECT id 
    FROM `my-db` 
    WHERE id in UNNEST(@ids) 
""" 
query_job = client.run_async_query(
    str(uuid.uuid4()), 
    query, 
    query_parameters=(
     bigquery.ArrayQueryParameter('ids', 'STRING', id_list), 
    ) 
) 

In Python, wenn Sie tun:

t = (1) 

und dann laufen:

type(t) 

Sie werden feststellen, Das Ergebnis ist int. Aber wenn Sie das tun:

t = (1,) 

Dann ergibt sich ein Tupel.

+0

Arbeitete wie ein Zauber :) Ich kann nicht glauben, dass ich zwei Tage damit verbracht habe! Danke, Will. – thn

1

Sie müssen 'STRING' verwenden, anstatt 'ARRAY<STRING>' für den Array-Element-Typen, zB:

query_parameters=(
    bigquery.ArrayQueryParameter('ids', 'STRING', id_list) 

Das Beispiel aus dem querying data Thema :

def query_array_params(gender, states): 
    client = bigquery.Client() 
    query = """ 
     SELECT name, sum(number) as count 
     FROM `bigquery-public-data.usa_names.usa_1910_2013` 
     WHERE gender = @gender 
     AND state IN UNNEST(@states) 
     GROUP BY name 
     ORDER BY count DESC 
     LIMIT 10; 
     """ 
    query_job = client.run_async_query(
     str(uuid.uuid4()), 
     query, 
     query_parameters=(
      bigquery.ScalarQueryParameter('gender', 'STRING', gender), 
      bigquery.ArrayQueryParameter('states', 'STRING', states))) 
    query_job.use_legacy_sql = False 

    # Start the query and wait for the job to complete. 
    query_job.begin() 
    wait_for_job(query_job) 
    print_results(query_job.results()) 
+0

Ich versuchte das auch und bekam den gleichen Fehler. – thn

+0

Sie setzen auch 'query_job.use_legacy_sql = False', richtig? –

+0

Ja, ich habe es auf False gesetzt. – thn

Verwandte Themen