AWS Athena嵌套视图报错:列别名列表条目数与列数不匹配
Athena视图嵌套报错:Column alias list has 1 entries but 't' has 4 columns available
我创建了名为dummy的表用于访问S3存储的Parquet格式数据,随后通过以下语句创建dummy_flattened视图来扁平化数组列postlist:
CREATE OR REPLACE VIEW dummy_flattened AS select deviceid , a.postid , a.craterid , a.posttype , a.category FROM dummy cross join UNNEST(postlist) as t(a)
postlist列的示例数据如下:
[{category=[{id=1, name=Dance}], craterid=1, postid=1, posttype=a},
{category=[{2, name=Dance}], craterid=2, postid=2, posttype=b}]
当尝试基于dummy_flattened创建test视图时:
create or replace view test as select distinct deviceid from dummy_flattened limit 100
Athena抛出错误:
Failed analyzing stored view 'logs.dummy_flattened': line 19:12: Column alias list has 1 entries but 't' has 4 columns available
直接执行该查询语句可正常返回结果,但创建视图就会报错。若创建dummy_flattened时不展开a.postid等字段,能成功创建test视图,但我需要保留这些字段的扁平化视图,尝试过以下几种写法均未解决问题:
select deviceid,t.* as (a) FROM dummy cross join UNNEST(postlist) as tselect deviceid,(t.a.*) as (c,d,e,f) FROM dummy cross join UNNEST(postlist) as t(a)- 最开始使用的原始语句
解决方法
问题根源在于Athena存储视图时对UNNEST别名的解析逻辑:当使用UNNEST(postlist) as t(a)时,Athena会识别出t对应包含4个字段的结构,但你只指定了1个别名a,导致视图元数据存储异常。
你可以采用以下两种正确写法:
写法1:直接引用数组元素字段,不指定单个别名
CREATE OR REPLACE VIEW dummy_flattened AS SELECT deviceid, post_item.postid, post_item.craterid, post_item.posttype, post_item.category FROM dummy CROSS JOIN UNNEST(postlist) AS post_item
写法2:指定与结构字段数量匹配的别名
CREATE OR REPLACE VIEW dummy_flattened AS SELECT deviceid, postid, craterid, posttype, category FROM dummy CROSS JOIN UNNEST(postlist) AS t(postid, craterid, posttype, category)
以上两种写法都能让Athena正确存储视图元数据,之后基于dummy_flattened创建test视图就不会再出现报错。
内容的提问来源于stack exchange,提问作者Saketh Naidu
相关产品推荐
相关产品推荐

