如何将数据从Bigquery导出到CSV中的外部服务器?

时间:2019-01-22 22:47:18

标签: google-cloud-platform google-bigquery google-cloud-storage google-cloud-dataflow

我需要使从Google Big Query提取数据并导出到GCP外部服务器中的外部CSV的过程自动化。

我只是研究如何做到这一点,因此发现了一些要从我的外部服务器运行的命令。但是我更喜欢在GCP中做所有事情以避免可能的问题。

要在Google存储空间中将查询运行为CSV

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

要从Google Storage下载CSV

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

但我想听听您的建议

1 个答案:

答案 0 :(得分:2)

如果要完全自动化此过程,我将执行以下操作:

  1. 创建一个Cloud Function来处理导出

这是更轻量级的解决方案,因为Cloud Functions是无服务器的,并提供了使用Client Libraries来实现代码的灵活性。请参见quickstart,我建议您使用控制台创建开始的功能。

在此示例中,我建议您触发Cloud Function from an HTTP request,即,当调用函数URL时,它将在其中运行代码。

Python中的示例Cloud Function代码,当发出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)

requirements.txt

google-cloud-bigquery

请注意,作业将在后台异步运行,您将收到带有作业ID的返回响应,您可以通过运行以下命令来在Cloud Shell中检查导出作业的状态:

bq show -j <job_id>
  1. 创建一个Cloud Scheduler计划的工作

按照此documentation开始。您可以使用standard cron format设置频率,例如0 0 * * *将每天在午夜运行作业。

作为目标,选择HTTP,在URL中放入Cloud Function HTTP URL(您可以在控制台中的Cloud Function详细信息内的Trigger选项卡下找到它),并作为{{1} }选择HTTP method

创建它,然后您可以通过在控制台中按GET按钮在Cloud Scheduler中对其进行测试。

  1. 同步您的外部服务器和存储桶

到目前为止,您仅计划将导出每24小时运行一次,现在要将存储区内容与本地计算机同步,可以使用gsutil rsync命令。如果要保存导入,请说到Run now文件夹,您可以在外部服务器上运行:

my_exports

要在服务器中定期运行此命令,可以在外部服务器内部创建标准的cron job in your crontab,也要每天运行一次,比bigquery导出晚几个小时,以确保导出已经制成。

额外

我已经将Cloud Function中的大多数变量硬编码为始终相同。但是,如果您执行gsutil rsync gs://BUCKET_WITH_EXPORTS /local-path-to/my_exports 请求而不是POST请求,则可以向函数发送参数,并将参数作为数据发送到正文中。

您将必须更改Cloud Scheduler作业,以向Cloud Function HTTP URL发送GET请求,并且在同一位置,您可以设置正文以发送与POST有关的参数,例如tabledataset。这样一来,您就可以在不同的时间,从不同的表到不同的存储桶运行导出。