Athena - 具有不兼容数据类型的联合表

Posted

技术标签:

【中文标题】Athena - 具有不兼容数据类型的联合表【英文标题】:Athena - Union tables with incompatible data types 【发布时间】:2021-09-14 11:51:07 【问题描述】:

我们有两个表,其中一个列的数据类型不同。第一个表中的列的类型为int,而第二个表中的同一列的类型为float/real。如果它是一个裸列,我可以将 CAST'ed 转换为一个通用类型,这里的问题是,这些列在 struct 的深处。

我得到的错误是,

SYNTAX_ERROR: line 23:1: column 4 in row(priceconfiguration row(maximumvalue integer, minimumvalue integer, type varchar, value integer)) 查询有不兼容的类型:Union, row(priceconfiguration row(maximumvalue integer, minimumvalue integer, type varchar,实数))

查询(简化)是,

 WITH t1 AS (
   SELECT
     "so"."createdon"
   , "so"."modifiedon"
   , "so"."deletedon"
   , "so"."createdby"
   , "so"."priceconfiguration"
   , "so"."year"
   , "so"."month"
   , "so"."day"
   FROM
     my_db.raw_price so
   UNION ALL    
    SELECT
     "ao"."createdon"
   , "ao"."modifiedon"
   , "ao"."deletedon"
   , "ao"."createdby"
   , "ao"."priceconfiguration"
   , "ao"."year"
   , "ao"."month"
   , "ao"."day"
   FROM
     my_db.src_price ao
) 
SELECT t1.* FROM t1 ORDER BY "modifiedon" DESC

事实上,真正的表比这更复杂,priceconfiguration 列嵌套在表的深处。所以 CASTing 有问题的列是直接不可能的,除非所有的 structs 都未嵌套到有问题的列 CAST

有没有UNION这两个表没有unnesting和casting的方法?

【问题讨论】:

将整个struct 列转换为string。如果您需要再次进入该结构,您可以将其转换回来,将麻烦的value 字段设置为string 【参考方案1】:

解决方案是将 Athena 引擎版本升级到 v2。

V2 引擎对模式演化有更多支持。根据 AWS 文档,

为 Parquet 格式的数据添加了架构演化支持。

添加了对从以下位置读取数组、映射或行类型列的支持 分区架构与表不同的分区 架构。当表模式在 分区已创建。更改的列类型必须兼容。 对于行类型,可以添加或删除尾随字段,但 对应的字段(按序号)必须具有相同的名称。

参考: https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference.html

【讨论】:

以上是关于Athena - 具有不兼容数据类型的联合表的主要内容,如果未能解决你的问题,请参考以下文章

只能对具有兼容列类型的表执行联合

Pandas 数据框类型 datetime64[ns] 在 Hive/Athena 中不起作用

Amazon Athena 表创建问题

如何在 Athena 中查询不明确的数据类型?

aws athena & java - 在结构类型列中获取数据

删除 Presto SQL 兼容数据库 (AWS Athena) 中数据中的双引号?