我在堆栈溢出中找不到完全相同的问题。道歉,如果这是一个重复的问题。 我正在使用此代码段将查询传递给表。
_body = {'_query':'SELECT * FROM `<projectId>.<datasetId>.<tableId>`',
'useLegacySql': False,
'maxResults': 100
}
table = _bq.jobs().query(projectId= <projectId>,alt = "json", body = _body).execute()
我传递了所有必需的参数,因为使用jobs.query API,我得到状态代码200,结果,但是在python程序中集成代码片段时,我得到以下错误:
文件“D:\ Applications \ Python27 \ lib \ site-packages \ oauth2client \ _helpers.py”,第133行,在positional_wrapper \ n中返回包装(* args,** kwargs)\ n','文件'D :\ Applications \ Python27 \ lib \ site-packages \ googleapiclient \ http.py“,第842行,执行\ n引发HttpError(resp,content,uri = self.uri)\ n','HttpError:https:// www.googleapis.com/bigquery/v2/projects/projectId/queries?alt=json返回“缺少必需参数”&gt; \ n']
答案 0 :(得分:2)
我不确定您在示例中使用的是哪个库,但我建议您使用Python BigQuery Client Libraries。您可以在GitHub reference page中找到完整的参考资料(以及大量示例)。
更具体地说,您可以在how to query data using the Python Client Library找到一些示例。
安装客户端库并设置身份验证(这两个步骤在the first link I shared中说明)之后,您将能够执行一个脚本,例如我在下面提供的脚本。在其中,正在查询公共数据集,但可以随意根据您的需要修改查询。
from google.cloud import bigquery
client = bigquery.Client()
# Define the query
query = "SELECT * FROM `bigquery-public-data.stackoverflow.posts_questions` LIMIT 10"
# Define the query job, by default uses Standard SQL
query_job = client.query(query)
results = query_job.result() # Waits for job to complete.
for row in results:
print("{}".format(row.title))
另请注意,此客户端库默认使用标准SQL(这是使用BigQuery的首选语言),但您始终可以按adjusting the QueryJobConfig
修改作业设置。
答案 1 :(得分:2)
我认为问题不是bq参数,而是execute()参数。 它应该具有http参数,您可以使用用户凭据提供http上下文
在appengine你可以做这样的事情
SCOPE='https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/cloud-patform '
_http = AppAssertionCredentials(scope=SCOPE).authorize(httplib2.Http(timeout=600))
table = _bq.jobs().query(projectId= <projectId>,alt = "json", body = _body).execute(http=_http)
答案 2 :(得分:1)
您确实没有发送所需的参数。检查this example了解如何正确执行此操作:
def sync_query(service, project_id, query, timeout=10000, num_retries=5):
query_data = {
'query': query,
'timeoutMs': timeout,
}
return service.jobs().query(
projectId=project_id,
body=query_data).execute(num_retries=num_retries)