Hive读取zst文件遇Unknown frame descriptor错误的技术求助
Hive读取zstd压缩文件Tez模式报错的解决方法
问题分析
你遇到的unknown frame descriptor错误,是因为Tez与MR对zstd压缩帧的解析逻辑不一致——MR能兼容的zstd格式,Tez可能因压缩级别不匹配或帧格式支持问题无法解析;而查询前100行正常,是因为小数据量下的解析逻辑未触发完整的压缩帧校验。
解决方案
1. 给表指定zstd压缩处理类
修改现有表的属性,明确指定zstd对应的压缩编解码器,让Tez能正确识别文件格式:
ALTER TABLE textfile SET TBLPROPERTIES ( 'mapreduce.input.fileinputformat.codec' = 'org.apache.hadoop.io.compress.ZStandardCodec', 'hive.input.format' = 'org.apache.hadoop.hive.ql.io.HiveInputFormat' );
若重新建表,可直接在DDL中声明:
CREATE TABLE textfile ( -- 替换为你的表字段定义 ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE TBLPROPERTIES ( 'mapreduce.input.fileinputformat.codec' = 'org.apache.hadoop.io.compress.ZStandardCodec' );
2. 配置Tez的压缩参数
在Hive会话中临时设置Tez的压缩相关参数,强制使用zstd编解码器:
SET tez.compression.codec=org.apache.hadoop.io.compress.ZStandardCodec; SET tez.runtime.compress=true; SET hive.exec.compress.output=true;
如果需要全局生效,可在hive-site.xml中添加对应配置项。
3. 重新压缩文件到Hive默认级别
用Hive默认的zstd压缩级别(3)重新压缩原文件,再上传到HDFS表路径:
zstd -3 a.csv -o a.csv.zst hdfs dfs -put a.csv.zst /user/hive/warehouse/textfile/
4. 临时切换回MR模式
如果上述方法暂时无法生效,可在执行count查询前切换回MR引擎:
SET hive.execution.engine=mr; SELECT count(*) FROM textfile;
内容的提问来源于stack exchange,提问作者CompEng
相关产品推荐
相关产品推荐

