如何使用第一行的列名将CSV导入BigQuery?

时间:2014-02-15 00:10:00

标签: google-bigquery

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

我正在寻找的是一种读取CSV文件并根据第一行中的列名创建模式的方法。如果所有变量类型最终都是字符串,那也没关系。我觉得这是一个非常常见的场景..有没有人对此有任何指导?

非常感谢, 尼克

3 个答案:

答案 0 :(得分:4)

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

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

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

然而,后两种方法都存在缺点; bigquery加载机制不保证保留数据的排序。实际上,第一行应始终是表中的第一行,但不能保证始终为真。

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

答案 1 :(得分:1)

对于记录,现在可以使用模式推断:https://cloud.google.com/bigquery/federated-data-sources#auto-detect

答案 2 :(得分:0)

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

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

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