Мне не совсем понятно, что вы имеете в виду, когда говорите, что ваш запрос сообщает о списке списков с различным количеством уровней.
В клиентской библиотеке 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)