Как запланировать экспорт из таблицы BigQuery в облачное хранилище? - PullRequest
1 голос
/ 10 января 2020

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

Можно ли запланировать экспорт таблицы BigQuery в облачное хранилище, чтобы в дальнейшем я мог планировать ее отправку по SFTP через Google BigQuery Data Transfer Services?

Ответы [ 2 ]

1 голос
/ 11 января 2020

Не существует управляемой службы для планирования экспорта таблиц BigQuery, но одним из жизнеспособных подходов является использование Облачных функций в сочетании с Cloud Scheduler .

Облачная функция будет содержать необходимый код для экспорта в облачное хранилище из таблицы BigQuery. Для этого есть несколько языков программирования, таких как Python, Node.JS и Go.

Cloud Scheduler периодически отправляет вызов HTTP в формате cron в облачную функцию, которая, в свою очередь, запускается и запускает экспорт программно.

В качестве примера и, более конкретно, вы можете выполнить следующие шаги:

  1. Создать облачную функцию используя Python с HTTP триггером . Для взаимодействия с BigQuery из кода необходимо использовать клиентскую библиотеку BigQuery . Импортируйте его с помощью from google.cloud import bigquery. Затем вы можете использовать следующий код в main.py для создания задания экспорта из BigQuery в облачное хранилище:

        # Imports the BigQuery client library
        from google.cloud import bigquery
    
        def hello_world(request):
            # Replace these values according to your project
            project_name = "YOUR_PROJECT_ID" 
            bucket_name = "YOUR_BUCKET" 
            dataset_name = "YOUR_DATASET" 
            table_name = "YOUR_TABLE" 
            destination_uri = "gs://{}/{}".format(bucket_name, "bq_export.csv.gz")
    
            bq_client = bigquery.Client(project=project_name)
    
            dataset = bq_client.dataset(dataset_name, project=project_name)
            table_to_export = dataset.table(table_name)
    
            job_config = bigquery.job.ExtractJobConfig()
            job_config.compression = bigquery.Compression.GZIP
    
            extract_job = bq_client.extract_table(
                table_to_export,
                destination_uri,
                # Location must match that of the source table.
                location="US",
                job_config=job_config,
            )  
            return "Job with ID {} started exporting data from {}.{} to {}".format(extract_job.job_id, dataset_name, table_name, destination_uri)
    

    Укажите зависимость клиентской библиотеки в требованиях . TXT файл, добавив эту строку:

    google-cloud-bigquery
    
  2. Создать задание Cloud Scheduler . Установите Frequency you wi sh для задания, которое должно быть выполнено. Например, установка 0 1 * * 0 будет запускать задание раз в неделю в 1:00 каждое воскресное утро. Инструмент crontab *1061* очень полезен, когда дело доходит до экспериментов с планированием cron.

    Выберите HTTP в качестве Target , установите URL в качестве URL-адреса облачной функции (ее можно найти, выбрав облачную функцию и перейдя на вкладку Триггер), и в качестве метода HTTP выберите GET.

    После создания и, нажав кнопку RUN NOW , вы можете проверить поведение экспорта. Однако перед этим убедитесь, что учетная запись службы App Engine по умолчанию имеет как минимум роль Cloud IAM roles/storage.objectCreator, в противном случае операция может завершиться с ошибкой разрешения. Учетная запись службы App Engine по умолчанию имеет вид YOUR_PROJECT_ID@appspot.gserviceaccount.com.

    Если вы хотите sh выполнять экспорт в разные таблицы, наборы данных и сегменты для каждого выполнения, но, по сути, используя одну и ту же облачную функцию, вы можете вместо этого используйте метод HTTP POST и настройте Body , содержащий указанные параметры в качестве данных, которые будут переданы в облачную функцию - хотя это подразумевает небольшие изменения в коде.

Наконец, когда создается задание, вы можете использовать возвращенные облачной функции job ID и CLI bq для просмотра состояния задания экспорта с помощью bq show -j <job_id>.

0 голосов
/ 11 января 2020

У вас есть альтернатива второй части ответа Максима. Код для извлечения таблицы и ее хранения в облачном хранилище должен работать.

Но, когда вы планируете запрос, вы также можете определить PubSub topi c, где планировщик BigQuery будет опубликовать сообщение, когда работа закончена. Таким образом, настройка планировщика, как описано в Maxim, является необязательной, и вы можете просто подключить функцию к уведомлению PubSub.

Перед выполнением извлечения не забудьте проверить Состояние ошибки уведомления pubsub . У вас также есть много информации о запланированном запросе; полезно, если вы хотите выполнить больше проверок или обобщить функцию.

Итак, еще один момент, касающийся передачи SFTP. Я открыл источник проекта для запроса BigQuery, создал файл CSV и передал этот файл на FTP-сервер (sFTP и FTP не поддерживаются, потому что моя предыдущая компания использовала только протокол FTP!). Если ваш файл меньше 1,5 ГБ, я могу обновить свой проект для добавления поддержки SFTP, если вы хотите использовать это. Дайте мне знать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...