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

nts*_*sue 10 google-bigquery

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

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

非常感谢,尼克

Jor*_*ani 5

一种选择(不是特别令人愉快的选择,而是一种选择)是从应用程序脚本向GCS发出原始HTTP请求,以读取数据的第一行,将其拆分为逗号,然后从中生成模式。GCS没有应用脚本的集成,因此您需要手工构建请求。Apps Script确实有一些实用程序(以及OAuth)可让您执行此操作,但我想这将是为达到正确目的而进行的大量工作。

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

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

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

抱歉,没有更好的解决方案。我们很长一段时间以来一直在桌子上提出​​功能请求,以自动推断模式。我将此作为另一票。