2016-03-09 3 views
1

Я о данных, хранящихся в 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 
+1

Я думаю, вы ошибаетесь о 'GROUP BY'! Начиная с 'ORDER BY' - когда вы устанавливаете' 'allowLargeResults' 'значение true - то, что вы на самом деле делаете, - вы позволяете BigQuery вычислять результат параллельно. Как вы можете себе представить - это невозможно, если вы используете ORDER BY верхнего уровня. Таким образом, ограничение –

+0

Я получаю, что он сканирует строки параллельно, я ищу обходной путь для этого сценария ... Было бы возможно, например, разделять данные по имени_и_и и упорядочивать каждый раздел на uuid? – ksiomelo

+2

Ответ зависит от того, почему вам нужно сортировать таблицу. Если это связано с тем, что вам нужно экспортировать его за пределы BigQuery - существует обходное решение. Но если он отсортировал данные, они останутся в BigQuery - можете ли вы объяснить, почему вам нужна сортировка? –

ответ

2

Чтобы ответить на этот вопрос в вашем редактирования, необходимо фактически указать аналитическую функцию, чтобы применить более запрошенной раздел. Поскольку вам просто нужно текущее значение для каждой строки, вы можете использовать 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] 
Смежные вопросы