【问题标题】:How to schedule an export from a BigQuery table to Cloud Storage?如何安排从 BigQuery 表到 Cloud Storage 的导出?
【发布时间】:2020-04-28 11:09:27
【问题描述】:

我已在 BigQuery 中成功安排我的查询,并将结果保存为我的数据集中的表格。我看到了很多关于安排输入到 BigQuery 或 Cloud Storage 的数据传输的信息,但我还没有找到任何关于安排将 BigQuery 表导出到 Cloud Storage 的任何信息.

是否可以安排将 BigQuery 表导出到 Cloud Storage,以便我可以进一步安排通过 Google BigQuery 数据传输服务将其通过 SFTP 传输给我?

【问题讨论】:

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


    【解决方案1】:

    没有用于安排 BigQuery 表导出的托管服务,但一种可行的方法是将 Cloud FunctionsCloud Scheduler 结合使用。

    Cloud Function 将包含从 BigQuery 表导出到 Cloud Storage 的必要代码。有多种编程语言可供选择,例如 PythonNode.JSGo

    Cloud Scheduler 会以 cron 格式定期向 Cloud Function 发送 HTTP 调用,Cloud Function 反过来会被触发并以编程方式运行导出。

    作为一个示例,更具体地说,您可以按照以下步骤操作:

    1. Create a Cloud Function using Python with an HTTP trigger。要在代码中与 BigQuery 交互,您需要使用 BigQuery client library。使用from google.cloud import bigquery 导入它。然后,您可以在 ma​​in.py 中使用以下代码创建从 BigQuery 到 Cloud Storage 的导出作业:

          # 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)
      

      requirements.txt 文件中指定客户端库依赖项 通过添加这一行:

      google-cloud-bigquery
      
    2. Create a Cloud Scheduler job。设置您想要的频率 要执行的作业。例如,将其设置为0 1 * * 0 将在每周日凌晨 1 点每周运行一次作业。这 crontab tool 在进行实验时非常有用 与 cron 调度。

      选择 HTTP 作为 Target,将 URL 设置为 Cloud 函数的 URL(可以通过选择 Cloud Function 和 导航到 Trigger 选项卡),并作为 HTTP 方法选择 GET

      创建后,按下立即运行按钮,您可以测试如何导出 行为。但是,在执行此操作之前,请确保 default App Engine service account 至少具有 Cloud IAM roles/storage.objectCreator 角色,否则操作可能会因权限错误而失败。默认 App Engine 服务帐号的格式为 YOUR_PROJECT_ID@appspot.gserviceaccount.com

      如果您希望在不同的表上执行导出, 每次执行的数据集和存储桶,但本质上使用相同的 Cloud Function,您可以使用 HTTP POST 方法 而是配置一个包含上述参数的 Body 作为数据, 将被传递给 Cloud Function - 虽然,这意味着做 对其代码进行了一些小改动。

    最后,创建作业后,您可以使用云函数返回的job IDbq CLI 来查看导出作业的状态bq show -j <job_id>

    【讨论】:

      【解决方案2】:

      您可以替代 Maxim 答案的第二部分。提取表并将其存储到 Cloud Storage 的代码应该可以工作。

      但是,当您安排查询时,您也可以define a PubSub topic where the BigQuery scheduler 将在作业结束时发布消息。因此,Maxim 所描述的调度程序设置是可选的,您可以简单地plug the function to the PubSub notification.

      在执行提取之前,不要忘记检查error status of the pubsub notification。您还有很多关于预定查询的信息;有用的是您想要执行更多检查或想要泛化函数。

      所以,关于 SFTP 传输的另一点。我open sourced a projet for querying BigQuery, build a CSV file and transfert this file to FTP server(不支持sFTP和FTP,因为我以前的公司只使用FTP协议!)。如果您的文件小于 1.5Gb,如果您想使用它,我可以更新我的项目以添加 SFTP 支持。告诉我

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-13
        • 1970-01-01
        • 2021-10-10
        • 2017-12-14
        • 2021-08-22
        • 2020-01-19
        • 1970-01-01
        相关资源
        最近更新 更多