Экспорт данных из BigQuery в GCS - возможна ли частичная передача?
В настоящее время я экспортирую свои данные (из таблицы назначения в Bigquery) в корзину в GCS. Делаем это программно с помощью API Bigquery.
Существует ограничение при экспорте данных из Bigquery в GCS - размер данных не должен превышать 1 ГБ.
- Поскольку мои данные в таблице назначения превышают 1 ГБ, я разбил файлы на несколько частей.
- Количество частей, на которые будет разделен файл, очевидно, будет зависеть от размера данных, которые у меня есть в моей целевой таблице.
Вот фрагмент кода для функции exportDataToGCS(), где это происходит:
http = authorize();
bigquery_service = build('bigquery', 'v2', http=http)
query_request = bigquery_service.jobs()
DESTINATION_PATH = constants.GCS_BUCKET_PATH + canonicalDate + '/'
query_data = {
'projectId': 'ga-cnqr',
'configuration': {
'extract': {
'sourceTable': {
'projectId': constants.PROJECT_ID,
'datasetId': constants.DEST_TABLES_DATASET_ID,
'tableId': canonicalDate,
},
'destinationUris': [DESTINATION_PATH + canonicalDate + '-*.gz'],
'destinationFormat': 'CSV',
'printHeader': 'false',
'compression': 'GZIP'
}
}
}
query_response = query_request.insert(projectId=constants.PROJECT_NUMBER,
body=query_data).execute()
После того, как эта функция выполнена, в моем GCS-хранилище мои файлы отображаются следующим образом:
Тем не менее, мне любопытно узнать, могут ли быть какие-либо сценарии, когда файл должен был быть разделен на 10 частей, но только 3 части добрались до корзины, потому что вышеприведенная функция завершилась неудачно.
То есть может ли быть частичный экспорт?
Могут ли такие причины, как прекращение работы сети или процесс, выполняющий убиваемую функцию и т.д., привести к этому? Является ли этот процесс блокирующим вызовом? Асинхронный?
Заранее спасибо.
Обновление 1: параметр состояния в ответе на запрос
Вот как я проверяю статус DONE.
while True:
status = query_request.get(projectId=constants.PROJECT_NUMBER, jobId=query_response['jobReference']['jobId']).execute()
if 'DONE' == status['status']['state']:
logging.info("Finished exporting for the date : " + stringCanonicalDate);
return
1 ответ
Частичный экспорт возможен, если по какой-то причине задание не выполняется в середине выполнения.
Если задание находится в состоянии ВЫПОЛНЕНО, и в задании нет ошибок, то все данные были экспортированы.
Я рекомендую немного подождать перед опросом для выполненной работы - вы можете столкнуться с ошибками ограничения скорости, если опрашиваете слишком быстро, и учитывая, что эти асинхронные задания не быстрые, точность в миллисекундах не требуется.
Работая с примером кода, вот как вы можете проверить наличие ошибок:
while True:
status = query_request.get(projectId=constants.PROJECT_NUMBER, jobId=query_response['jobReference']['jobId']).execute()
if 'DONE' == status['status']['state']:
if 'errorResult' in status['status']:
logging.error("Error exporting for the date : " + stringCanonicalDate);
logging.error(status['status']['errorResult'])
return False
logging.info("Finished exporting for the date : " + stringCanonicalDate);
return True
time.sleep(1)
Чтобы быть сверхнадежным, вы также можете отлавливать ошибки HTTP, которые иногда возникают во время цикла ожидания опроса. Похоже, вы используете апиклиент Python, который повышает apiclient.errors.HttpError
на такие неудачи.