Как сгладить Google BigQuery результат в Python - PullRequest
0 голосов
/ 05 июня 2018

У меня большая база данных, которую я пытаюсь сделать с помощью python и API BigQuery.

Но проблема в том, что он возвращает список списков, и у меня возникают проблемы с выравниванием результатов.

сейчас я делаю это:

client = bigquery.Client.from_service_accoun_json('...')
query_job = client.query("""...""")
result = query_job.result()

И отсюда я потерян, список может варьироваться от 1 уровня до 3-4 уровней, что крайне затрудняет поиск результатов.

Есть ли эффективный способ сгладить результаты?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Для выравнивания таблиц BigQuery с повторяющимися полями, на мой взгляд, было бы лучше использовать функцию BQ FLATTEN.Это должно работать быстрее и будет выглядеть более очевидным, чем выравнивание, если перебрать повторяющееся поле в самом Python. Сглаживание повторного типа

Таким образом, вы можете сделать что-то похожее на:

client = bigquery.Client.from_service_accoun_json('...')
query_job = client.query('SELECT your_column from FLATTEN([dataset.tableId], repeated_column)')
result = query_job.result()

Было бы лучше проверить этот такой запрос в BQ UI на количество данныхбудет получен до исполнения.

0 голосов
/ 05 июня 2018

Мне не совсем понятно, что вы имеете в виду, когда говорите, что ваш запрос сообщает о списке списков с различным количеством уровней.

В клиентской библиотеке BigQuery Python query_job являетсяобъект типа google.cloud.bigquery.job.QueryJob.Чтобы перебрать результаты, вам просто нужно добавить цикл в ваш код, например:

client = bigquery.Client()
query_job = client.query("...")
for row in query_job:
    print(row)

Каждый объект row содержит одну из строк, возвращенных из запроса BigQuery, который вы запустили.В зависимости от того, используете ли вы стандартный SQL или устаревший SQL, формат row будет отличаться.Стандартный SQL является рекомендуемым и предпочтительным языком для запроса данных из BigQuery, но одной из характеристик Legacy SQL является то, что автоматически выравнивает результаты запроса , поэтому вы можете использовать его, если для вложенных и повторяющихся полей возникают проблемывы.В противном случае вы можете сгладить результаты в стандартном SQL с помощью оператора UNNEST .

Чтобы работать с конкретными полями в результате запроса, вам просто нужно работать с объектом rowкак:

  • Для «обычных» полей: row.field1
  • Для вложенных полей в стандартном SQL: row.parent[0]["child"]
  • Для вложенных полей в устаревшем SQL: row.parent_child

В любом случае, напечатав один из объектов row, вы увидите доступные поля и способы их перебора.В общем, их можно рассматривать как обычные словари Python.


В качестве примечания: для использования Legacy SQL с клиентской библиотекой Python (по умолчанию он использует стандартный SQL) вам нужно толькодобавить параметр QueryJobConfig, например:

client = bigquery.Client()
job_config = bigquery.QueryJobConfig()
job_config.use_legacy_sql = True
query_job = client.query("...", job_config=job_config)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...