我需要自动化一个过程,以从 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]
但我想听听你的建议
如果您想完全自动化此过程,我会执行以下操作:
这是更轻量级的解决方案,因为 Cloud Functions 是无服务器的,并提供了使用客户端库实现代码的灵活性。请参阅快速入门,我建议您使用控制台来创建函数以开始使用。
在这个例子中,我建议您从 HTTP 请求中触发 Cloud Function ,即当函数 URL 被调用时,它将运行其中的代码。
Python 中的示例 Cloud Function 代码,它在发出 HTTP 请求时创建导出:
主文件
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)
要求.txt
google-cloud-bigquery
请注意,作业将在后台异步运行,您将收到带有作业 ID 的返回响应,您可以使用它来检查 Cloud Shell 中导出作业的状态,方法是运行:
bq show -j <job_id>
按照本文档开始。您可以使用标准 cron 格式设置频率,例如0 0 * * *
每天午夜运行作业。
作为目标,选择HTTP
,在 URL 中放置 Cloud Function HTTP URL(您可以在控制台中的 Cloud Function details 内的 Trigger 选项卡下找到它),然后HTTP method
选择GET
。
创建它,您可以通过按下Run now
控制台中的按钮在Cloud Scheduler 中对其进行测试。
到目前为止,您只安排了每 24 小时运行一次的导出,现在要将存储桶内容与本地计算机同步,您可以使用该gsutil rsync
命令。如果要保存导入,可以说my_exports
文件夹,您可以在外部服务器中运行:
gsutil rsync gs://BUCKET_WITH_EXPORTS /local-path-to/my_exports
要在您的服务器中定期运行此命令,您可以在外部服务器内的 crontab 中创建一个标准的cron 作业,每天运行,仅在 bigquery 导出后几个小时运行,以确保导出已完成.
额外的:
我已将 Cloud Function 中的大部分变量硬编码为始终相同。但是,您可以向函数发送参数,如果您执行POST
请求而不是GET
请求,并将参数作为数据发送到正文中。
例如,您必须更改 Cloud Scheduler 作业以向POST
Cloud Function HTTP URL发送请求,并且在同一位置您可以设置正文以发送有关table
、dataset
和的参数bucket
。这将允许您在不同的时间从不同的表和不同的存储桶运行导出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句