【问题标题】:Let Google BigQuery infer schema from csv string file让 Google BigQuery 从 csv 字符串文件中推断架构
【发布时间】:2023-03-17 17:16:01
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: csv google-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 添加的额外列,但查询不是免费的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多