有没有办法一次在 BigQuery 中创建多个表?

Posted

技术标签:

【中文标题】有没有办法一次在 BigQuery 中创建多个表?【英文标题】:Is there any way to create multiple tables in BigQuery at once? 【发布时间】:2021-06-10 09:43:35 【问题描述】:

我在 GCS 的存储桶中有很多 json 文件,我需要为每个文件创建一个表。

通常,我在 BigQuery 中手动执行:选择格式 (json),为其命名并使用自动检测到的架构。

有没有办法使用 GCS 中的数据一次创建多个表?

【问题讨论】:

【参考方案1】:

免责声明:我在https://medium.com/p/54228d166a7d 有一篇关于此主题的博文

基本上,您可以利用 Cloud Workflows 来自动化此过程。

一个示例工作流程是:

ProcessItem:
  params: [project, gcsPath]
  steps:
    - initialize:
        assign:
          - dataset: wf_samples
          - input: $gcsPath
# omitted parts for simplicity 
    - runLoadJob:
        call: BQJobsInsertLoadJob_FromGCS
        args:
          project: $project
          configuration:
            jobType: LOAD
            load:
              sourceUris: $gcsPath
              schema:
                fields:
                  - name: "mydate"
                    type: "TIMESTAMP"
                  - name: "col1"
                    type: "FLOAT"
                  - name: "col2"
                    type: "FLOAT"
              destinationTable:
                projectId: $project
                datasetId: $dataset
                tableId: $"table_"+output.index
        result: loadJobResult
    - final:
        return: $loadJobResult
BQJobsInsertLoadJob_FromGCS:
  params: [project, configuration]
  steps:
    - runJob:
        call: http.post
        args:
          url: $"https://bigquery.googleapis.com/bigquery/v2/projects/"+project+"/jobs"
          auth:
            type: OAuth2
          body:
            configuration: $configuration
        result: queryResult
        next: queryCompleted
    - queryCompleted:
        return: $queryResult.body

【讨论】:

【参考方案2】:

在this answer 中,您有一个解决方案可以递归地遍历您的存储桶并将 csv 文件加载到 BQ。例如,您可以修改此代码:

gsutil ls gs://mybucket/**.json | \
    xargs -I echo  | \
    awk 'n=split($1,A,"/"); q=split(A[n],B,"."); print "mydataset."B[1]" "$0' | \
    xargs -I sh -c 'bq --location=YOUR_LOCATION load --replace=false --autodetect --source_format=NEWLINE_DELIMITED_JSON '

如果您想手动并行运行加载作业。

如果您想添加自动化,您可以使用@Pentium10 推荐的工作流,或者将 Bash 命令插入到 Cloud Run 实例中并与调度程序结合使用(您可以查看this repo 以获得灵感)

【讨论】:

以上是关于有没有办法一次在 BigQuery 中创建多个表?的主要内容,如果未能解决你的问题,请参考以下文章

使用 dbt for-loop 在 BigQuery 中创建多个表

在 BigQuery 中创建动态视图

我可以一次在程序中创建具有不同名称的表吗[关闭]

有没有办法一次在多个文件上使用 COPY?

有没有办法一次在 Unity 3d 动画窗口中添加多个属性?

有没有办法在一个脚本中创建多个触发器?