我想将csv数据上传到BigQuery。当数据具有不同的类型(如string和int)时,它能够使用标题推断列名,因为标题都是字符串,而其他行包含整数。
BigQuery通过比较文件的第一行来推断标头 数据集中的其他行。如果第一行只包含字符串, 而其他行则没有,BigQuery假设第一行是a 标题行。
https://cloud.google.com/bigquery/docs/schema-detect
问题是当你的数据都是字符串......
您可以指定--skip_leading_rows
,但BigQuery仍然不会将第一行用作变量的名称。
我知道我可以手动指定列名,但我不希望这样做,因为我有很多表。还有其他解决方案吗?
答案 0 :(得分:3)
如果您的数据全部采用“字符串”类型,并且您的CSV文件的第一行包含元数据,那么我想很容易做一个快速的脚本来解析CSV的第一行并生成一个类似的“创建表”命令:
bq mk --schema name:STRING,street:STRING,city:STRING... -t mydataset.myNewTable
使用该命令创建一个新的(void)表,然后将CSV文件加载到该新表中(如上所述使用--skip_leading_rows)
14/02/2018:感谢Felipe的评论更新:
以上评论可以通过这种方式简化:
bq mk --schema `head -1 myData.csv` -t mydataset.myNewTable
答案 1 :(得分:1)
目前的API无法实现。您可以在公共BigQuery跟踪器https://issuetracker.google.com/issues/new?component=187149&template=0中提交功能请求。
作为解决方法,您可以在文件的第二行末尾添加单个非字符串值,然后在“加载”配置中设置allowJaggedRows选项。下行是你会在你的桌子上得到一个额外的列。如果不接受额外的列,则可以使用查询而不是加载,并选择*除了添加的额外列,但查询不是免费的。