Как я могу экспортировать данные из Bigquery на внешний сервер в CSV? - PullRequest
0 голосов
/ 23 января 2019

Мне нужно автоматизировать процесс извлечения данных из Google Big Query и их экспорта во внешний CSV на внешний сервер за пределами GCP.

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

Чтобы выполнить запрос к CSV в хранилище Google

bq --location=US extract --compression GZIP 'dataset.table' gs://example-bucket/myfile.csv

Чтобы загрузить CSV из хранилища Google

gsutil cp gs://[BUCKET_NAME]/[OBJECT_NAME] [OBJECT_DESTINATION]

Но я хотел бы услышать ваши предложения

1 Ответ

0 голосов
/ 23 января 2019

Если вы хотите полностью автоматизировать этот процесс, я бы сделал следующее:

  1. Создание Облачной функции для обработки экспорта :

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

В этом примере я рекомендую вам запускать облачную функцию из HTTP-запроса , т. Е. Когда вызывается URL-адрес функции, он запускает код внутри нее.

Пример кода облачной функции в Python, который создает экспорт при выполнении HTTP-запроса:

main.py

from google.cloud import bigquery

def hello_world(request):
    project_name = "MY_PROJECT"
    bucket_name = "MY_BUCKET"
    dataset_name = "MY_DATASET"
    table_name = "MY_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)

needs.txt

google-cloud-bigquery

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

bq show -j <job_id>
Создать Облачный планировщик запланированное задание :

Следуйте этой документации , чтобы начать работу.Вы можете установить частоту с помощью стандартного формата cron , например, 0 0 * * * будет запускать задание каждый день в полночь.

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

Создайте его, и вы можете проверить егов облачном планировщике, нажав кнопку Run now на консоли.

Синхронизируйте ваш внешний сервер и корзину :

До сих пор у вас был запланированный экспорт только для запуска каждые 24 часа, теперь для синхронизации содержимого корзины с вашим локальным компьютеромВы можете использовать команду gsutil rsync.Если вы хотите сохранить импорт, скажем, в папку my_exports, вы можете запустить на внешнем сервере:

gsutil rsync gs://BUCKET_WITH_EXPORTS /local-path-to/my_exports

Чтобы периодически запускать эту команду на вашем сервере, вы можете создать стандарт задание cron в вашем crontab на внешнем сервере, которое также запускается каждый день, всего на несколько часов позже, чем экспорт bigquery, чтобы гарантировать, что экспорт был выполнен.

Extra :

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

Вам придется изменить планировщик облака.задание на отправку запроса POST на HTTP-адрес облачной функции, и там же вы можете настроить тело для отправки параметров, например, table, dataset и bucket.Это позволит вам запускать экспорт из разных таблиц в разные часы и в разные сегменты.

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