使用jobs.query()BQ API时Http错误:400缺少必需参数

时间:2018-05-29 13:12:15

标签: python google-cloud-platform google-bigquery

我在堆栈溢出中找不到完全相同的问题。道歉,如果这是一个重复的问题。 我正在使用此代码段将查询传递给表。

_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']

3 个答案:

答案 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)