Athena创建Parquet分区表后查询无结果,执行MSCK仍无效求助
解决Athena外部分区表查询无结果的问题
先修正建表语句的语法错误
你提供的建表语句里,最后一个字段request_day后面多了个多余的逗号,这会导致语法问题,先删掉这个逗号重新建表:
CREATE EXTERNAL TABLE IF NOT EXISTS `test_data`.`test_funnel` ( `request_id` string, `request_time_ms` timestamp, `request_date` timestamp, `request_day` timestamp ) PARTITIONED BY (`dt` string, `is_won` int) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://data/data_a/agg_data_b/' TBLPROPERTIES ('classification' = 'parquet');
排查S3路径与分区定义不匹配的问题
从MSCK REPAIR TABLE的提示来看,你的S3路径结构是dt=20210828/20210831223158/is_won=1,这不符合Athena的分区路径规范——每个分区键必须对应单独的键=值层级,不能在dt=xxx目录下再嵌套子目录。
解决办法二选一:
调整S3文件结构:把Parquet文件移动到符合规范的路径下,比如
dt=20210828/is_won=1(如果20210831223158是冗余中间目录);如果这个时间串是dt的一部分,就把路径改成dt=20210828/20210831223158/is_won=1,此时dt作为字符串类型存储,后续查询时注意过滤逻辑即可。手动添加分区:如果无法修改S3结构,直接用
ALTER TABLE语句手动指定分区路径:
ALTER TABLE test_data.test_funnel ADD PARTITION (dt='20210828/20210831223158', is_won=1) LOCATION 's3://data/data_a/agg_data_b/dt=20210828/20210831223158/is_won=1/';
验证结果
手动添加分区后,再次执行查询语句即可获取数据。如果仍有问题,检查S3路径是否正确、分区键的数据类型是否与路径中的值匹配(比如is_won是int类型,路径里的is_won=1符合要求)。
内容的提问来源于stack exchange,提问作者idan
相关产品推荐
相关产品推荐

