即使allowlargerresults=True,在BigQuery中的简单SELECT上“Response too large to return”?

2024-06-16 13:33:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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}$

有几个不同的事情让我困惑不解:

  1. 它说我应该使用allowLargeResults,即使我已经使用了。在
  2. 虽然这是一个没有分组的直接SELECT查询,但它返回了1行。在

我知道,如果查询处理的任何部分变得太大,就会触发警告。但是我真的不知道如何解决这个问题,因为我所做的查询只是一个没有分组的SELECT,我甚至没有使用SELECT *。在

当然,BigQuery的全部意义在于它可以处理这种事情?在

我怎样才能解决这个问题?在


Tags: orgrefdatarequestservicejobcodebigquery
3条回答

让我们来澄清一下这里的一些错误。在

返回大结果的查询受到其他限制:

  • 必须指定目标表。在
  • 不能指定顶级ORDER BY、top或LIMIT子句。这样做会抵消使用allowLargeResults的好处,因为查询输出不再可以并行计算。在
  • 只有与partitionby子句结合使用时,窗口函数才能返回大型查询结果。在

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

Added example of configuration:

'query': {
    'query': 'my_query_text',
    'destinationTable': {
        'projectId': 'my_project',
        'datasetId': 'my_dataset',
        'tableId': 'my_table'
    },
    'createDisposition': 'CREATE_IF_NEEDED',
    'writeDisposition': 'WRITE_TRUNCATE',
    'allowLargeResults': True
}

相关问题 更多 >