创建含结构体数组列的AWS Athena Parquet表遇语法错误求助
解决AWS Athena创建嵌套数组结构体Parquet表的语法错误
我来帮你搞定这个问题——你遇到的报错完全是因为Athena(底层基于Presto引擎)的嵌套类型语法和Spark/Hive的写法不兼容导致的,看起来合法的语法其实不符合Athena的SQL规范。
问题分析
先看你原建表语句里的关键错误点:
foo array< struct< bar: int, bam: int > >
Spark和Hive用尖括号<>来定义数组、结构体这类泛型类型,但Athena遵循Presto SQL的语法规则,不支持尖括号包裹类型定义,而是要求用圆括号()来替代,结构体的声明方式也需要对应调整。
修正后的建表语句
把嵌套类型的写法改成Athena兼容的形式即可,以下是修正后的完整语句:
create table "db"."fufu" ( foo array( struct( bar: int, bam: int ) ) ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' WITH SERDEPROPERTIES ('serialization.format' = '1') LOCATION 's3://yada/yada/' TBLPROPERTIES ('has_encrypted_data'='false');
额外说明
虽然Spark和Athena都能处理Parquet文件,但二者的SQL语法在嵌套类型声明上有明显差异:
- Spark/Hive:用
<>指定泛型参数,比如array<struct<...>> - Athena(Presto):用
()包裹元素/字段定义,比如array(struct(...))
因为你的Parquet文件本身元数据是正确的(Spark可以正常读取),修改语法后Athena就能正确解析并创建表了。
内容的提问来源于stack exchange,提问作者Little Bobby Tables
相关产品推荐
相关产品推荐

