Я о данных, хранящихся в 4Гбе BigQuery 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, , невозможно использовать ORDER BY или GROUP BY, если для флажка allowLargeResults установлено значение true. И, конечно, запрос такой большой таблицы требует этого. Есть ли обходной путь для этого сценария? Я попытался выполнить сортировку на стороне клиента, однако после успешной загрузки первых нескольких страниц возникает ошибка «Существующее соединение было принудительно закрыто удаленным хостом».
Вот моя работа запрос:
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'}
EDIT: Попытка разобраться в разделе
я потенциально может решить эту проблему, если я полагаю как разделять по имени сущности и сортировать по 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
Я думаю, вы ошибаетесь о 'GROUP BY'! Начиная с 'ORDER BY' - когда вы устанавливаете' 'allowLargeResults' 'значение true - то, что вы на самом деле делаете, - вы позволяете BigQuery вычислять результат параллельно. Как вы можете себе представить - это невозможно, если вы используете ORDER BY верхнего уровня. Таким образом, ограничение –
Я получаю, что он сканирует строки параллельно, я ищу обходной путь для этого сценария ... Было бы возможно, например, разделять данные по имени_и_и и упорядочивать каждый раздел на uuid? – ksiomelo
Ответ зависит от того, почему вам нужно сортировать таблицу. Если это связано с тем, что вам нужно экспортировать его за пределы BigQuery - существует обходное решение. Но если он отсортировал данные, они останутся в BigQuery - можете ли вы объяснить, почему вам нужна сортировка? –