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

Google bigquery 如何使用第一行的列名将CSV导入BigQuery?,google-bigquery,Google Bigquery,我目前有一个用appscript编写的应用程序,可以将一些CSV文件从云存储导入bigquery。虽然这非常简单,但我不得不为目标表指定模式 我要寻找的是一种读取CSV文件并基于第一行中的列名创建模式的方法。如果所有变量类型最终都是字符串,这是可以的。我觉得这是很常见的情况。。有人对此有任何指导吗 非常感谢, Nick一个选项(不是特别令人愉快的选项,而是一个选项)是从应用程序脚本向GCS发出原始HTTP请求,以读取第一行数据,用逗号分割数据,并由此生成模式。GCS没有应用程序脚本集成,因此您需

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

我要寻找的是一种读取CSV文件并基于第一行中的列名创建模式的方法。如果所有变量类型最终都是字符串,这是可以的。我觉得这是很常见的情况。。有人对此有任何指导吗

非常感谢, Nick

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

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

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

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


抱歉,没有更好的解决方案。很长一段时间以来,我们在表上有一个自动推断模式的特性请求;我将再次投票支持它。

记录在案,现在可以进行模式推断:

根据William Vambenepe的答案,大查询现在可以猜测模式。文档页面移动到:

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


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

如果我想将所有文本文件作为一个大字符串加载到一行中,并包含一个大字符串列?这个答案在2019年仍然相关吗?自从提出这个问题以来已经三年多了,现在是否有任何直接的BigQuery API方法可用于从外部源设置模式或在没有模式的情况下加载CSV?