Athena仅查询Parquet数据时报HIVE_BAD_DATA错误如何解决
错误原因
该报错是因为你指定的S3表路径下存在非Parquet格式的文件,你创建的表声明了存储格式为Parquet,Hive/Athena默认会扫描路径下所有文件,遇到.ctl、.xml、.crc这类不符合Parquet格式规范的文件时,会触发Parquet文件魔术数校验失败,抛出HIVE_BAD_DATA错误。
解决方案
- 方案1:配置参数忽略非Parquet文件
直接修改现有表的属性,开启忽略非Parquet文件的配置,执行如下ALTER TABLE语句即可:
如果是自建Hive集群,也可以在查询前执行会话级配置临时生效:ALTER TABLE `test` SET TBLPROPERTIES ( 'hive.ignore.non.parquet.files' = 'true', 'parquet.ignore.corrupt.files' = 'true' );SET hive.ignore.non.parquet.files=true; SELECT * FROM "test" limit 10; - 方案2:修正建表逻辑
你当前建表语句的字段声明部分是空括号,需要补全和Parquet文件结构对应的字段名和数据类型,同时在建表时就添加忽略非Parquet文件的配置:
如果你的Parquet文件有统一CREATE EXTERNAL TABLE `test`( -- 替换为实际的字段列表 column1 string, column2 int, column3 timestamp ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS PARQUET LOCATION 's3:/some location/' TBLPROPERTIES ( 'classification'='parquet', 'created_by'='system', 'has_encrypted_data'='true', 'hive.ignore.non.parquet.files' = 'true' ).parquet后缀,也可以额外添加路径匹配规则,仅识别后缀为parquet的文件,进一步提升查询稳定性 - 方案3:清理表路径下的非Parquet文件
将你指定的S3路径下所有非Parquet格式的文件(包括错误提示中的control_file.ctl、以及xml、crc、json等其他格式文件)移动到其他不属于该表的路径,保证表对应路径下只有合法的Parquet文件后,即可正常执行查询。
内容的提问来源于stack exchange,提问作者Sarang
相关产品推荐
相关产品推荐

