问题描述
我们有两个表,其中一列的数据类型不同。第一个表中的列的类型为 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
有问题的列。
有没有办法在不UNION
ing 和 unnest
ing 的情况下cast
这两个表?
解决方法
解决方案是将 Athena 引擎版本升级到 v2。
V2 引擎对模式演化有更多的支持。根据 AWS 文档,
为 Parquet 格式的数据添加了模式演变支持。
添加了对读取数组、映射或行类型列的支持 分区模式与表不同的分区 架构。这可能发生在表架构更新后 分区已创建。更改的列类型必须兼容。 对于行类型,可以添加或删除尾随字段,但 对应的字段(按顺序)必须具有相同的名称。
参考: https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference.html