Я могу предложить два подхода:
вариант 1
SELECT
данные в блоках, чтобы уменьшить размер данных, которые вы получали на каждой итерации от BigQuery.
Например, ваша таблица является разделом, вы можете сделать это:
WHERE _PARTITIONTIME = currentLoopDate
где currentLoopDate будет переменной даты в вашем коде Python (аналогичная опция будет использовать ROW_NUMBER
вариант 2
Используя клиентскую библиотеку BigQuery , вы можете использовать Jobs.insert API и установить configuration.query.priority
для пакетной обработки.
# from google.cloud import bigquery
# client = bigquery.Client()
query = (
'SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` '
'WHERE state = "TX" '
'LIMIT 100')
query_job = client.query(
query,
# Location must match that of the dataset(s) referenced in the query.
location='US') # API request - starts the query
for row in query_job: # API request - fetches results
# Row values can be accessed by field name or index
assert row[0] == row.name == row['name']
print(row)
См. ссылку для более подробной информации.
После получения jobId напишите цикл, используя Jobs.getQueryResults , чтобы получить порции данных, установив параметр maxResults
API