Python gcloud BigQuery 中的 run_async_query 使用标准 SQL 而不是旧版 SQL

Posted

技术标签:

【中文标题】Python gcloud BigQuery 中的 run_async_query 使用标准 SQL 而不是旧版 SQL【英文标题】:run_async_query in Python gcloud BigQuery using Standard SQL instead of Legacy SQL 【发布时间】:2016-07-26 23:14:02 【问题描述】:

我需要使用 gcloud python BigQuery 库运行异步查询。此外,我需要使用 beta standard sql 而不是默认的 legacy sql 运行查询。根据文档 here、here 和 here,我相信我应该能够只需将作业上的use_legacy_sql 属性设置为False。但是,由于针对 Legacy SQL 处理查询,这仍然会导致错误。 如何成功使用此属性来指示我希望使用哪个 SQL 标准来处理查询?

下面的示例 Python 代码:

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)

这个输出:

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

如果您使用旧版 SQL 在 BigQuery 控制台中运行它,则会遇到同样的错误。当我在 BigQuery 控制台中复制粘贴查询并使用标准 SQL 运行它时,它执行得很好。注意:错误位置 (2.20 - 2.64) 对于上面的查询可能不完全正确,因为它是一个示例,我在其中混淆了我的一些个人信息。

【问题讨论】:

如果您创建了 stdz_job,为什么还要检查 job.state/job.errors。这里的工作对象是什么? 好眼莫莎,我调整了我的代码来制作这个示例——在原始文件中,我循环了多个 stdz 作业实例,将它们保存在一个列表中,然后再次循环它们以检查状态。我编辑了代码以反映此示例中的单个工作场景。 您的其他属性(例如目的地、allow_large_results)是否也通过此方法正确设置?我浏览了客户端代码,这似乎应该可以正常工作。看起来对useLegacySql 参数的支持是added about a week ago:你有最新版本的客户端吗? @DannyKitt 是的,其他属性已成功设置。我正在使用最新的 pypi 版本——gcloud 0.17.0(我使用 pip 安装的)。 【参考方案1】:

use_legacy_sql property 在 0.17.0 版本中不存在,因此您需要检查当前的 master 分支。但是它现在确实存在于 0.18.0 版中,所以在通过 pip 升级 gcloud-python 之后,你应该可以继续使用了。

【讨论】:

以上是关于Python gcloud BigQuery 中的 run_async_query 使用标准 SQL 而不是旧版 SQL的主要内容,如果未能解决你的问题,请参考以下文章

使用nodejs gcloud上传到bigquery时如何启用错误

尝试运行 bigquery 时 gcloud auth 登录问题 403 访问被拒绝

将 gcloud 虚拟机实例监控数据提取到 BigQuery

在使用 BigQuery API 的 python 插入作业期间登录失败

更新 bigquery 架构时出现异常

Google Cloud DataCatalog