让 Google BigQuery 从 csv 字符串文件中推断架构

Posted

技术标签:

【中文标题】让 Google BigQuery 从 csv 字符串文件中推断架构【英文标题】:Let Google BigQuery infer schema from csv string file 【发布时间】:2018-02-13 14:33:20 【问题描述】:

我想将 csv 数据上传到 BigQuery。当数据有不同的类型(如字符串和整数)时,它能够通过标题推断列名,因为标题都是字符串,而其他行包含整数。

BigQuery 通过将文件的第一行与 数据集中的其他行。如果第一行只包含字符串, 而其他行没有,BigQuery 假定第一行是 标题行。

https://cloud.google.com/bigquery/docs/schema-detect

问题是当你的数据都是字符串时......

您可以指定 --skip_leading_rows,但 BigQuery 仍然不使用第一行作为变量的名称。

我知道我可以手动指定列名,但我不想这样做,因为我有很多表。还有其他解决方案吗?

【问题讨论】:

【参考方案1】:

如果您的数据全部为“字符串”类型,并且您的 CSV 文件的第一行包含元数据,那么我想很容易做一个快速脚本来解析 CSV 的第一行并生成类似的“创建表”命令:

bq mk --schema name:STRING,street:STRING,city:STRING... -t mydataset.myNewTable

使用该命令创建一个新(空)表,然后将您的 CSV 文件加载到该新表中(使用您提到的 --skip_leading_rows)

14/02/2018:感谢 Felipe 的评论更新:

上面的评论可以这样简化:

bq mk --schema `head -1 myData.csv` -t mydataset.myNewTable

【讨论】:

你可以缩短这个:bq mk --schema name,street,city,... -t mydataset.myNewTable(STRING 是默认值) 不错。所以这意味着创建命令可以更加简化:bq mk --schema `head -1 myData.csv` -t mydataset.myNewTable 是的,我使用了这个更短的版本并且它工作正常。您能否将其放入您的原始答案中,以便我可以将其标记为我的问题的解决方案。谢谢!【参考方案2】:

目前的 API 无法实现。您可以在公共 BigQuery 跟踪器https://issuetracker.google.com/issues/new?component=187149&template=0 中提出功能请求。

作为一种解决方法,您可以在文件的第二行末尾添加一个非字符串值,然后在加载配置中设置 allowJaggedRows 选项。缺点是你会在你的表中得到一个额外的列。如果不能接受额外的列,可以使用查询代替加载,并选择 * EXCEPT 添加的额外列,但查询不是免费的。

【讨论】:

以上是关于让 Google BigQuery 从 csv 字符串文件中推断架构的主要内容,如果未能解决你的问题,请参考以下文章

将 CSV 文件从 Google Drive 加载到 BigQuery 会产生零行且没有错误

Bigquery 直接查询 Google Storage 中的 csv 文件

如何根据本地 csv 的 where 子句从 pandas 访问 Google Bigquery 数据

在 Google BigQuery 中创建 CSV 表的困难

Google Bigquery 的 Apps 脚本未知错误

BigQuery 能否在 Google Cloud Storage 中基于 CSV 文件的外部表中使用通配符?