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

问题描述

我们有两个表,其中一列的数据类型不同。第一个表中的列的类型为 SELECT COUNT(*) AS total_number_of_followups_scheduled,COUNT(CASE status WHEN 'Completed' THEN 1 END) AS number_followups_completed FROM promis_lt ,而第二个表中的同一列的类型为 int/float。如果它是一个裸列,我可以将 real 转换为普通类型,这里的问题是,这些列位于 CAST 的深处。

我得到的错误是,

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

查询(简化)是,

struct

实际上,真正的表比这更复杂,列 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 无法直接对有问题的列进行CAST,除非所有 struct 都未嵌套到 CAST 有问题的列。

有没有办法在不UNIONing 和 unnesting 的情况下cast 这两个表?

解决方法

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

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

为 Parquet 格式的数据添加了模式演变支持。

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

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