【问题标题】:How to import CSV to BigQuery using columns names from first row?如何使用第一行的列名将 CSV 导入 BigQuery?
【发布时间】:2014-03-14 12:59:41
【问题描述】:

我目前有一个用 appscript 编写的应用程序,可以将一些 CSV 文件从云存储导入 bigquery。虽然这很简单,但我不得不为目标表指定架构。

我正在寻找的是一种读取 CSV 文件并根据第一行中的列名创建架构的方法。如果所有变量类型都以字符串结尾,那也没关系。我觉得这是一个很常见的情况.. 有人对此有任何指导吗?

非常感谢, 尼克

【问题讨论】:

  • 问这个问题已经三年多了,现在是否有任何直接的 BigQuery API 方法可以从外部源设置架构或在没有架构的情况下加载 CSV?

标签: google-bigquery


【解决方案1】:

一个选项(不是特别令人愉快的选项,但一个选项)是从应用程序脚本向 GCS 发出原始 HTTP 请求,以读取第一行数据,将其拆分为逗号,并从中生成架构。 GCS 没有应用程序脚本集成,因此您需要手动构建请求。 Apps Script 确实有一些实用程序可以让您执行此操作(以及 OAuth),但我猜想这将是一个相当大的工作量。

您还可以从 BigQuery 方面尝试一些事情。您可以将数据作为单个字段导入临时表(将字段分隔符设置为不存在的内容,例如“\r”)。您可以通过 tabledata.list() 读取标题行(即临时表的第一行)。然后,您可以运行拆分查询,然后使用正则表达式将单个字段拆分为列,并设置 allow_large_results 和目标表。

另一种选择是使用具有比以往更多的列的虚拟模式,然后使用 allow_jagged_rows 选项允许行末尾缺少数据的行。然后,您可以使用 tabledata.list() 读取第一行(类似于上一个选项)并计算出实际存在的行数。然后你可以生成一个查询,用正确的列名重写表。这种方法的优点是不需要正则表达式或解析;它让 bigquery 完成所有的 CSV 解析。

然而,后两种方法都有缺点; bigquery 加载机制不保证保留数据的顺序。在实践中,第一行应该始终是表中的第一行,但不能保证始终如此。

抱歉,没有更好的解决方案。很长一段时间以来,我们一直有一个关于自动推断模式的功能请求;我将把它作为另一个投票。

【讨论】:

  • 如果我想将所有文本文件作为一个大字符串加载到具有大字符串列的一行中?
  • 这个答案在 2019 年仍然有意义吗?
【解决方案2】:

【讨论】:

    【解决方案3】:

    根据 William Vambenepe 的回答,Big Query 现在可以猜测架构。文档页面移至: https://cloud.google.com/bigquery/docs/schema-detect

    请注意,您的导入仍然会失败,因为它只查看前 100 行。如果您在一列看似整数的列中有一个罕见的“NA”或“Other”,这可能会出现问题。

    当此功能首次推出时,您可以返回并在 Web UI 上手动更改有问题的字段类型,因为当您重新加载失败的导入时,猜测会自动填充架构。它似乎不再这样做了,希望它会在未来的更新中返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 2014-07-29
      • 1970-01-01
      • 2013-02-05
      相关资源
      最近更新 更多