AWS Athena查询因输出CSV/metadata文件报错HIVE_BAD_DATA求助
解决Athena读取Parquet数据时因输出文件导致的HIVE_BAD_DATA错误
问题背景
基于AWS Athena处理SNAPPY压缩Parquet数据的应用,每次查询执行后会在指定S3输出桶生成csv和metadata文件,下一次查询时Athena会扫描到这些非Parquet文件,触发以下错误:
HIVE_BAD_DATA: Not valid Parquet file: s3://MY_OUTPUT_BUCKET/logs/QUERY_NAME/2022/08/07/tables/894a1d10-0c1d-4de1-9e61-13b2b0f79e40.metadata expected magic number: PAR1 got: HP
目前需要手动删除这两个文件才能正常查询,且无法通过正则排除文件,需自动解决方案。
可行解决方案
1. 隔离查询输出与数据源路径
核心问题是查询输出文件和Parquet数据源路径重叠,导致Athena扫描到非Parquet文件。解决办法:
- 每次查询使用唯一的输出子目录,比如按查询时间戳、UUID生成独立路径,例如:
s3://MY_OUTPUT_BUCKET/logs/QUERY_NAME/20220807153000/ - 确保Athena表的
LOCATION仅指向纯Parquet数据的路径,不包含任何查询输出目录。
2. 自动清理冗余输出文件
通过AWS Lambda实现自动删除csv和metadata文件:
- 创建Lambda函数,编写逻辑删除指定前缀下的
.csv和.metadata文件; - 配置S3事件触发:当输出桶中有新的PutObject事件,且文件名匹配
.csv或.metadata后缀时,触发Lambda执行删除操作; - 注意设置Lambda的IAM权限,确保拥有S3的DeleteObject权限,同时限制触发范围到目标前缀,避免误删Parquet数据。
3. 使用CTAS替代直接输出到S3
如果查询目的是生成可复用的结果,直接用CTAS(Create Table As Select)语句将结果写入Parquet格式的新表,而非输出csv:
CREATE TABLE my_query_result WITH ( format = 'PARQUET', compression = 'SNAPPY', external_location = 's3://MY_OUTPUT_BUCKET/query_results/my_result/' ) AS SELECT * FROM my_parquet_table WHERE ...;
这种方式不会生成多余的csv和metadata文件,后续查询直接引用my_query_result表即可,无需扫描原始S3路径。
4. 强制表的Parquet格式过滤
在Athena表定义中明确指定输入输出格式,强制仅识别Parquet文件:
ALTER TABLE my_parquet_table SET TBLPROPERTIES ( 'input.format' = 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat', 'output.format' = 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' );
该配置会让Athena在扫描路径时自动忽略非Parquet格式的文件,即使路径中有csv或metadata文件也不会触发错误。
内容的提问来源于stack exchange,提问作者Majd Rezik
相关产品推荐
相关产品推荐

