通过Python API客户端发送到BigQuery时,验证查询语法错误

时间:2016-03-10 20:59:33

标签: python sql api google-bigquery google-api-client

这是我的问题:

SELECT hits.page.pagePath
FROM [(project_id):(dataset_id).ga_sessions_20151019]
GROUP BY hits.page.pagePath LIMIT 1

它在网络用户界面中运行。

这是我的代码:

from oauth2client.service_account import ServiceAccountCredentials
from httplib2 import Http
from apiclient.discovery import build
import json

query = "SELECT hits.page.pagePath FROM [(project_id):(dataset_id).ga_sessions_20151019] GROUP BY hits.page.pagePath LIMIT 1",

path = (filepath of credentials json file)
scopes = ['https://www.googleapis.com/auth/bigquery']
credentials = ServiceAccountCredentials.from_json_keyfile_name(path,scopes)
http_auth = credentials.authorize(Http())
bigquery = build('bigquery','v2',http=http_auth)

req_body = {
    "timeoutMs": 60000,
    "kind": "bigquery#queryRequest",
    "dryRun": False,
    "useQueryCache": True,
    "useLegacySql": False,
    "maxResults": 100,
    "query": query,
    "preserveNulls": True,
  }

bigquery.jobs().query(projectId=(project_id),body=req_body).execute()

当我运行它时,我收到以下错误:

HttpError: <HttpError 400 when requesting https://www.googleapis.com/bigquery/v2/projects/cardinal-path/queries?alt=json returned "Syntax error: Unexpected "["">

它似乎不喜欢我的查询字符串中的括号,但我不知道如何逃避它们(如果这是问题)。有谁看到我做错了什么?我不知道我与API的连接是一个问题,因为我能够看到我已经启动的所有工作(由于上述HttpError /语法错误而导致所有工作都失败)调用服务对象(&#39; bigquery&#39; above)jobs()。list()函数。谢谢!

1 个答案:

答案 0 :(得分:4)

我发现您在查询请求中将useLegacySql设置为False

[projectid:datasetid.tableid]这样的括号引用文字是遗留BigQuery SQL方言的一部分。

新的sql方言使用反向标记来引用文字。所以试试:

SELECT hits.page.pagePath FROM `project_id:dataset_id.ga_sessions_20151019` GROUP BY hits.page.pagePath LIMIT 1

或者,由于您将project_id作为正在运行作业的项目传递,因此默认情况下所有数据集查找都将解析为该项目,因此您可以删除projectid:前缀并使用datasetid.tableid像:

SELECT hits.page.pagePath FROM dataset_id.ga_sessions_20151019 GROUP BY hits.page.pagePath LIMIT 1

虽然这对于用户类型的查询很方便,但如果所有查询都是代码生成的,那么始终使用带引号的完全限定引用可能是最安全的。

更新:另一种方法是使用SQL的标准点分隔符和非遗留SQL方言,即

SELECT hits.page.pagePath 
FROM project_id.dataset_id.ga_sessions_20151019
GROUP BY hits.page.pagePath LIMIT 1