我在Python中使用BigQuery。我正试图弄清楚如何运行一个简单的SELECT
查询,但是我得到了关于大结果的错误。在
在用Python编写查询之前,我已经在BigQuery接口中进行了测试。它运行良好,返回1行,耗时4.0秒,处理18.2GB。底层表大约有150GB,200m行。在
这是我的代码:
credentials = GoogleCredentials.get_application_default()
bigquery_service = build('bigquery', 'v2', credentials=credentials)
try:
query_request = bigquery_service.jobs()
query_data = {
"allowLargeResults": True,
'query': (
'SELECT org_code, item_code FROM [mytable] ',
"WHERE (time_period='201501') ",
"AND item_code='0212000AAAAAAAA' ",
"AND (org_code='B82005') "
"LIMIT 10;"
)
}
print ' '.join(query_data['query'])
response = query_request.query(
projectId=project_id,
body=query_data).execute()
job_ref = response['jobReference']
print 'job_ref', job_ref
except HttpError as err:
print('Error: {}'.format(err.content))
raise err
这是我得到的输出:
^{pr2}$有几个不同的事情让我困惑不解:
allowLargeResults
,即使我已经使用了。在SELECT
查询,但它返回了1行。在我知道,如果查询处理的任何部分变得太大,就会触发警告。但是我真的不知道如何解决这个问题,因为我所做的查询只是一个没有分组的SELECT
,我甚至没有使用SELECT *
。在
当然,BigQuery的全部意义在于它可以处理这种事情?在
我怎样才能解决这个问题?在
让我们来澄清一下这里的一些错误。在
返回大结果的查询受到其他限制:
documentation很清楚
configuration.query.allowLargeResults
如果为真,则允许查询生成任意大的结果表,但性能稍有下降。需要设置destinationTable。在我看了一下您的工作;您没有设置allowLargeResults,也没有使用限制或过滤器(您的查询实际上只是从表中选择两个字段)。在
在bigQueryAPI中有两种运行查询的方法。第一种方法是调用
jobs.query()
。这是一个简单的方法,但这是缺少的。另一种方法是使用查询作业配置调用jobs.insert()
。它完全支持设置目标表和允许大的结果。在看起来您调用的是前者(
jobs.query()
),但您想要jobs.insert()
。在使用更成熟的
jobs.insert()
调用比听起来更容易。您可以从jobs.insert()
调用中获取作业id,然后将其传递给jobs.getQueryResults()
以获得查询结果;该方法返回的结果格式与调用jobs.query()
相同。查看示例代码here。在如果
configuration.query.allowLargeResults
设置为true-它还需要configuration.query.destinationTable
您应该添加destinationTable对象,或者(因为您的输出看起来很小)将allowlargerresults设置为false
相关问题 更多 >
编程相关推荐