1

В настоящее время я экспортирую свои данные (из таблицы назначения в Bigquery) в ведро в GCS. Выполняйте это программно с помощью API Bigquery.Экспорт данных из BigQuery в GCS - возможен частичный перевод?

Существует ограничение при экспорте данных из 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() 

После выполнения этой функции, в моем ГКС ведро, мои файлы отображаются следующим образом:

File parts in GCS bucket after exporting from BigQuery

Однако, я хотел бы знать, может ли быть какие-либо сценарии, в которых файл должен был быть разделен на 10 частей, но только 3 части пробился в ведро б если вышеуказанная функция не удалась.

То есть, может быть частичный экспорт?

Могут ли такие причины, как падение сети или процесс, выполняющий функцию, убивать и т. Д., Приводят к этому? Этот процесс блокирует вызов? Асинхронный?

Заранее спасибо.

Update 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 
+0

, когда вы говорите, что «вышеуказанная функция не удалась», есть ли сообщение об ошибке? или это ваш единственный признак неудачи в том, что вам не хватает 3 частей? – Patrice

+0

Ответ на запрос, который вы возвращаете, имеет параметр «Статус». Если это значение равно «DONE», это означает, что запрос завершен. – activelearner

+0

Проверьте обновление в моем вопросе.Первый фрагмент кода и второй фрагмент кода находятся в блоке try. – activelearner

ответ

4

Частичный экспорт возможен, если работа по какой-либо причине не срабатывает по какой-либо причине в середине исполнения.

Если задание находится в состоянии DONE, и нет ошибок в задании,, тогда все данные были экспортированы.

Я рекомендую немного подождать до опроса для выполнения заданий - вы можете столкнуться с ошибками ограничения скорости, если вы проводите опрос слишком быстро, и учитывая, что эти асинхронные задания не быстрые, точность в миллисекундах не требуется.

Работа с примерами кода, вот как вы можете проверить на наличие ошибок:

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, которые иногда возникают в то время как в цикле опроса ожидания. Похоже, вы используете apiclient python, который поднимает apiclient.errors.HttpError на такие сбои.

+0

Спасибо. Это имеет смысл. – activelearner

 Смежные вопросы

  • Нет связанных вопросов^_^