2014-02-15 50 views
8

我目前有一个用appscript编写的应用程序,可以将一些CSV文件从云存储导入bigquery。虽然这很简单,但我不得不指定目标表的模式。如何使用第一行的列名将CSV导入到BigQuery?

我在寻找的是一种读取CSV文件的方法,并根据第一行中的列名创建模式。如果所有变量类型都以字符串结尾,那就没问题了。我觉得这是一个很常见的情况..有没有人有任何指导呢?

许多感谢, 尼克

+0

这个问题已经有三年多了,现在有没有可用的直接BigQuery API方法来设置来自外部源的架构或在没有架构的情况下加载CSV? –

回答

4

一个选项(不是一个特别愉快,但一个选项)将是使从应用脚本GCS原始HTTP请求读取数据的第一行,把它分解在逗号上,并从中生成一个模式。 GCS没有应用程序脚本集成,因此您需要手动构建请求。应用程序脚本确实有一些实用程序可以让您执行此操作(以及OAuth),但我的猜测是,要获得正确的结果将是一项体面的工作。

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

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

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

抱歉没有更好的解决方案。我们在桌面上长时间发布了一个功能请求来自动推断模式;我会以此为另一票。

+0

如果我想将所有文本文件作为一个大字符串加载到大字符串列的一行中? –

0

大厦关闭威廉Vambenepe的回答,大查询现在可以在架构猜测。文档页面移至: https://cloud.google.com/bigquery/docs/schema-detect

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

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

相关问题