我有大约 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/