我需要使从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]
但我想听听您的建议
答案 0 :(得分:2)
如果要完全自动化此过程,我将执行以下操作:
这是更轻量级的解决方案,因为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>
按照此documentation开始。您可以使用standard cron format设置频率,例如0 0 * * *
将每天在午夜运行作业。
作为目标,选择HTTP
,在URL中放入Cloud Function HTTP URL(您可以在控制台中的Cloud Function详细信息内的Trigger选项卡下找到它),并作为{{1} }选择HTTP method
。
创建它,然后您可以通过在控制台中按GET
按钮在Cloud Scheduler中对其进行测试。
到目前为止,您仅计划将导出每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
有关的参数,例如table
和dataset
。这样一来,您就可以在不同的时间,从不同的表到不同的存储桶运行导出。