将数据从存储加载到 bigquery 时解析数据类型时出错

Posted

技术标签:

【中文标题】将数据从存储加载到 bigquery 时解析数据类型时出错【英文标题】:Error parsing datatype when loading data from storage to bigquery 【发布时间】:2020-10-21 03:05:30 【问题描述】:

我有一个大型的 bigquery 表,其架构如下:

id:integer,age:integer,name:string,id2:integer,grade1:float,....,grade100:float

该表是从谷歌存储加载的,现在我正在尝试附加另一个具有相同列数和“相同类型”列的文件。问题是这两个文件都是使用相同的脚本生成的,但似乎(由于我仍然不知道的原因)第二个文件中应该是整数的列是浮点数。因此,我尝试附加的第二个 csv 文件的架构是:

**id:float**,**age:float**,name:string,**id2:float**,grade1:float,....,grade100:float

这两个文件的一个例子是: BQ 表中的文件:

id age name id2  grade1 ..... grade100
1  22  John  3    6.2   .....  6.1

我试图附加的文件中的数据是这样的:

id    age   name  id2  grade1 ..... grade100
3.0   22.0  Peter 5.0    6.5   .....  6.3

如何“强制”或强制转换存储中文件的第二种数据类型以匹配我已经在 BQ 中的表的数据类型,这样我就不会在年龄、id 等方面存在这些冲突?

注意:这不是实际的架构。没有年龄或成绩,但它是一种更简单的方式来表示我遇到的问题。

编辑:我在 BigQuery 中没有第二个文件,这就是我想要做的。我正在遵循的步骤是:

    点击数据集 点击“创建表” 选择我感兴趣的存储桶/文件夹/文件 转到高级选项并选择“附加到表格”选项。

这是正确的做法吗?

【问题讨论】:

【参考方案1】:

你有它。字面意思是CAST()

例如,SELECT id, age, name, CAST(id2 as FLOAT64) ...

铸造转换的细节可以在https://cloud.google.com/bigquery/docs/reference/standard-sql/conversion_rules找到

【讨论】:

但是怎么做呢?我的意思是,我知道我可以使用CAST(),但我要附加的文件位于 Cloud Storage 中。是否可以通过 BigQuery 对 Google 存储中的文件执行 SELECT 查询? 对于负载情况,您可以指定最符合要求的显式模式(例如,使用 float64 而不是 integer64)。或者,如果您将数据附加到表中,加载将使用目标表的架构。 或者,先加载到临时表,然后再加载到 CREATE TABLE ... AS SELECT ...,但由于必须为每次加载运行额外的查询,因此效率较低(并且可能成本更高)。

以上是关于将数据从存储加载到 bigquery 时解析数据类型时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 spark 将 parquet 数据从 Google 云存储加载到 BigQuery

将数据从 Google 永久磁盘加载到 BigQuery?

将 avro 十进制数据加载到 BigQuery 中?

如何将 API 调用返回的数据直接加载到 BigQuery 中而不存储在 GCS 中?

将数据从 BigQuery 表加载到 Dataproc 集群时出错

将 csv 文件从云存储批量加载到 bigquery