0

Ich muss eine asynchrone Abfrage mit der BigQuery-Bibliothek gcloud python ausführen. Außerdem muss ich die Abfrage mit der Beta standard sql anstelle der Standard legacy sql ausführen.

Nach der Dokumentation here, here, und here Ich glaube, ich sollte in der Lage sein, nur die Eigenschaft auf dem Job zu False. Dies führt jedoch immer noch zu einem Fehler, da die Abfrage mit Legacy SQL verarbeitet wird. Wie kann ich diese Eigenschaft erfolgreich verwenden, um anzugeben, mit welchem ​​SQL-Standard die Abfrage verarbeitet werden soll?run_async_query in Python gcloud BigQuery mit Standard-SQL anstelle von Legacy-SQL

Beispiel Python-Code unter:

stdz_table = stdz_dataset.table('standardized_table1') 
job_name = 'asyncjob-test' 
query = """ 
    SELECT TIMESTAMP('2016-03-30 10:32:15', 'America/Chicago') AS special_date 
    FROM my_dataset.my_table_20160331; 
    """ 
stdz_job = bq_client.run_async_query(job_name,query) 
stdz_job.use_legacy_sql = False 
stdz_job.allow_large_results = True 
stdz_job.create_disposition = 'CREATE_IF_NEEDED' 
stdz_job.destination = stdz_table 
stdz_job.write_disposition = 'WRITE_TRUNCATE' 
stdz_job.begin() 

# wait for job to finish 
while True: 
    stdz_job.reload() 
    if stdz_job.state == 'DONE': 
     # print use_legacy_sql value, and any errors (will be None if job executed successfully) 
     print stdz_job.use_legacy_sql 
     print json.dumps(stdz_job.errors) 
     break 
    time.sleep(1) 

Diese Ausgänge:

False 
[{"reason": "invalidQuery", "message": "2.20 - 2.64: Bad number of arguments. Expected 1 arguments.", "location": "query"}] 

, die die gleichen Fehler, die Sie erhalten würden, wenn Sie es in der BigQuery Konsole mit Legacy-SQL laufen. Wenn ich die Abfrage in die BigQuery-Konsole kopieren und sie mit Standard-SQL ausführen, wird sie ordnungsgemäß ausgeführt. Hinweis: Der Fehlerort (2.20 - 2.64) stimmt möglicherweise nicht genau mit der obigen Abfrage überein, da es sich um ein Beispiel handelt und ich einige meiner persönlichen Daten darin verschleiert habe.

+0

Warum überprüfen Sie job.state/job.errors, wenn Sie stdz_job erstellt haben. Was ist das Jobobjekt hier? –

+0

Gutes Auge Mosha, ich habe meinen Code angepasst, um dieses Beispiel zu erstellen - im Original durchlaufe ich mehrere stdz-Jobinstanzen, halte sie in einer Liste und durchblättere sie dann alle erneut, um den Status zu überprüfen. Ich habe den Code so bearbeitet, dass er das Szenario für einen einzelnen Job in diesem Beispiel widerspiegelt. – KevinTydlacka

+0

Sind Ihre anderen Eigenschaften (z. B. Ziel, allow_large_results) auch ordnungsgemäß über diese Methode festgelegt? Ich schaute durch den Client-Code und das scheint so, als sollte es einfach funktionieren. Es sieht so aus, als wäre die Unterstützung für den Parameter 'useLegacySql' [vor etwa einer Woche hinzugefügt] (https://github.com/GoogleCloudPlatform/gcloud-python/commit/21ae0c97566c9e5e8f485cb7536fcd6e7efc44f3): Haben Sie die aktuellste Version des Clients? ? –

Antwort

1

Die use_legacy_sql property existierte nicht ab der Version 0.17.0, Sie hätten also den aktuellen Master-Zweig auschecken müssen. Allerdings existiert es jetzt als Release 0.18.0, also solltest du nach dem Upgrade von gcloud-python via pip gut gehen.