如何将多个 csv 文件(不同架构)加载到 bigquery 中

use*_*660 3 google-bigquery

我有 6,500 个 csv 文件,其中包含约 250 个不同的架构。即这些文件来自 FDIC(美国银行监管机构)数据集。它们已上传到谷歌云存储桶: 在此输入图像描述

每个财务季度都有大约 250 个不同的 csv。财务季度内的每个 csv 都有不同的架构: 在此输入图像描述

有大约 250 个独特的模式。每个财务季度都会重复这种模式。csv 文件可追溯到 1992 年 100 个财务季度: 在此输入图像描述

可以使用通配符上传具有相同架构的多个 CSV。例如gs/path/*.csv。但是,每个表名称并不是从文件名自动生成的。UI 需要表名作为输入: 在此输入图像描述

如何将具有不同架构的多个 csv 文件加载到 bigquery 中?

kha*_*han 5

我将自动执行此操作的方法基本上是从给定存储桶(或其子文件夹)中读取所有文件,并(做出假设)使用它们的“文件名”作为要摄取的目标表名。具体方法如下:

gsutil ls gs://mybucket/subfolder/*.csv | xargs -I{} echo {} | awk '{n=split($1,A,"/"); q=split(A[n],B,"."); print "mydataset."B[1]" "$0}' | xargs -I{} sh -c 'bq --location=US load --replace=false --autodetect --source_format=CSV {}'
Run Code Online (Sandbox Code Playgroud)

确保将location,替换mydataset为您想要的值。另外,请注意以下假设:

  • 每个 CSV 的第一行被假定为标题,因此被视为列名称。
  • 我们正在使用--replace=false标志进行写入,这意味着每次运行命令时都会附加数据。如果您想覆盖,只需将其转到true,所有表的数据将在每次运行时被覆盖。
  • CSV 文件名(之前的部分.csv用作表名。您可以修改 awk 脚本以将其更改为任何其他替代方案。