如何让 BigQuery 的 API 使用标准 SQL 进行查询?

Posted

技术标签:

【中文标题】如何让 BigQuery 的 API 使用标准 SQL 进行查询?【英文标题】:How to get BigQuery's API to use Standard SQL for queries? 【发布时间】:2016-12-23 19:04:48 【问题描述】:

尽管我们使用“useLegacySQL: False”标志发送 JSON 有效负载,但 BigQuery 使用的是旧版 SQL 而不是标准 SQL。标准 SQL 被拒绝 - 但系统将接受带有以下 JSON 的旧版 SQL。

据我们所知,我们正在关注BigQuery's documentation。我们需要什么才能让 BigQuery 通过此 API 调用使用标准 SQL?

这是我们的 BigQuery JSON 负载:


    'jobReference': 
        'jobId': '####',
        'projectId': 'healthlabs-4'
    ,
    'configuration': 
        'query': 
            'destinationTable': 
                'tableId': u 'our_table_name',
                'datasetId': 'our_dataset_id',
                'projectId': 'our_project_id'
            ,
            'useLegacySQL': False,
            'priority': 'INTERACTIVE',
            'query': u "SELECT ... FROM our_table WHERE ... GROUP BY ...   ORDER BY ...",
            'allowLargeResults': True
        
    

我们可以从 BigQuery 的返回消息中看出该查询被拒绝,该消息接受我们的旧版 SQL 但拒绝我们的标准 SQL 并出现以下错误:

'create_table_error': [u'location': u'query', u'message': u'Encountered " "FROM" "FROM "" at line 1, column 333.\nWas expecting:\n    ")" ...\n    ', u'reason': u'invalidQuery'], 'bq_table_exists': 'no' 

【问题讨论】:

【参考方案1】:

我们刚刚注意到 JSON 键是区分大小写的。这是一个大小写问题。 SQL 不应大写。正确的键是:

'useLegacySql':假

【讨论】:

【参考方案2】:

作为替代方案,不要定义useLegacySQL,而是在查询前加上#standardSQL,如下所示:

#standardSQL
SELECT COUNT(*)
FROM `bigquery-public-data.noaa_gsod.gsod2016` 

(这在浏览不能很好地处理额外 API 选项的库时非常有用)

https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql#sql-prefix

【讨论】:

以上是关于如何让 BigQuery 的 API 使用标准 SQL 进行查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 google-api-python-client 设置 BigQuery 配置属性?

如何让我的客户将 BigQuery 查询结果导出为 CSV

Bigquery/标准 SQL:如何使用 sum() 聚合所有列(大约 100 列)?

如何使用标准 SQL 在 BigQuery 中透视表?

BigQuery 标准 SQL 如何将行转换为列

如何使用标准 SQL (BigQuery) 与几个月不同