让 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 数据