sql - 如何在 BigQuery 中对大表进行排序?

标签 sql google-bigquery

我有大约 4GB 的数据以以下格式存储在 Google 的 BigQuery 中:

   uuid    |   entity_name    |    property    |    value   
---------------------------------------------------------------
  abc      |   Person         |   first_name   |  John
  def      |   Person         |   age          |  45
  abc      |   Person         |   age          |  26
  def      |   Person         |   first_name   |  Mary
...

我想获得按 uuid 排序的分页结果。但是,根据 documentation , 当标志“allowLargeResults”设置为 true 时,不能使用 ORDER BY 或 GROUP BY。 当然,查询如此大的表需要这样做。这种情况有解决方法吗?我尝试进行客户端排序,但是在成功获取前几页后,它引发了错误“远程主机强行关闭了现有连接”。

这是我的查询工作:
query = 'SELECT * FROM [Users.Events] ORDER BY uuid'

query_request = {
    'jobReference': {
        'projectId': project_id,
        'job_id': str(uuid.uuid4())
    },
    'configuration': {
        'query': {
            'query': query,
            'priority': 'BATCH' if BATCH_QUERY else 'INTERACTIVE',
            'allowLargeResults' : True,
            'destinationTable': {
                'projectId': project_id,
                'datasetId': 'CrunchBase',
                'tableId': 'AllProperties_query'
            },
            'createDisposition': 'CREATE_IF_NEEDED',
            'writeDisposition': 'WRITE_TRUNCATE',
        }
    }
}

query_job = service.jobs().insert(
    projectId=project_id,
    body=query_request).execute(num_retries=2)

poll_job(service, query_job)

结果:
RuntimeError: {u'reason': u'resourcesExceeded', u'message': u'Resources exceeded during query execution.', u'location': u'query'}

编辑:尝试在分区内排序

如果我弄清楚如何按 entity_name 分区并按 uuid 排序,我可能会解决这个问题,但是以下查询不起作用:
SELECT
  uuid, entity_name, property, value
OVER
  (PARTITION BY entity_name ORDER BY uuid) AS entities
FROM [CrunchBase.AllProperties];

结果:
Query Failed
Error: Missing function in Analytic Expression at: 1.15 - 1.70

最佳答案

要回答编辑中的问题,您需要实际指定一个分析函数以应用于该有序分区。由于您只需要每行的当前值,您可以使用 lead(x, 0) .

对于您的查询,您可以编写如下内容:

SELECT
  uuid, entity_name,
  LEAD(property, 0) OVER (PARTITION BY entity_name ORDER BY uuid) AS cur_property,
  LEAD(value, 0) OVER (PARTITION BY entity_name ORDER BY uuid) AS cur_value,
FROM [CrunchBase.AllProperties]

关于sql - 如何在 BigQuery 中对大表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35885403/

相关文章:

php - 所有单元格的背景颜色都是相同的

php - 使用php在不同的sql表中导入csv文件的选定列

sql - 我将如何编写此空间查询?

google-analytics - 在大查询中查询“in” eventAction数组

php - 用户/密码身份验证 PHP/MySQL - PHP 或 MySQL 查询中的比较?

mysql - 多对一关系的插入异常

php - 如何在将行流式传输到 BigQuery 时指定超时?

python - Google Big Query 中同步查询的作业配置

google-bigquery - SQL Workbench/J 和 BigQuery

sql - 如何优化 Google BigQuery 中重复的正则表达式提取