通过Trino查询Hive外部表时遇ORC文件格式错误求助
问题场景
执行查询语句 select * from transaction_lines; 时触发错误,错误详情如下:
SQL Error [16777219]: Query failed (#20220820_042537_00480_dszgc): Error opening Hive split hdfs://CDPSAPRODHA/warehouse/tablespace/external/hive/customer_360.db/transaction_lines/order_date=20220818/part-00167-c28380bb-d942-445e-acd6-09ec8b29d777.c000 (offset=0, length=213919): Malformed ORC file. Cannot read SQL type 'double' from ORC stream '.assortment_id' of type STRING with attributes {}
已知Hive外部表transaction_lines中assortment_id字段定义为string类型。
核心原因
Hive表元数据定义的字段类型与ORC文件实际存储的字段类型不匹配——表定义是string,但ORC文件中assortment_id的流数据存在类型冲突,导致Trino尝试以double类型解析该字段。
解决方案
1. 验证ORC文件实际存储类型
用orcfiledump工具分析出错的ORC文件,确认assortment_id的实际存储类型:
orcfiledump hdfs://CDPSAPRODHA/warehouse/tablespace/external/hive/customer_360.db/transaction_lines/order_date=20220818/part-00167-c28380bb-d942-445e-acd6-09ec8b29d777.c000
同时在Hive命令行执行以下命令核对表元数据:
DESCRIBE FORMATTED transaction_lines;
2. 修复类型不一致问题
- 如果表元数据定义错误:
若ORC文件中assortment_id实际是double类型,修改表字段定义匹配文件:ALTER TABLE transaction_lines CHANGE COLUMN assortment_id assortment_id double; - 如果ORC文件数据错误:
删除出错分区的错误数据,重新导入符合表定义(string类型)的正确数据:ALTER TABLE transaction_lines DROP PARTITION (order_date=20220818); -- 重新导入order_date=20220818分区的数据,确保assortment_id字段为string类型
3. 临时兼容配置(不推荐长期使用)
如果暂时无法修复数据,可在Trino的Hive连接器配置文件中添加以下参数,开启字符串到double的强制转换:
hive.orc.string-to-double-cast-enabled=true
修改后重启Trino集群生效,此方案仅作为临时绕过手段,长期仍需修复数据与元数据的一致性。
内容的提问来源于stack exchange,提问作者Jangyasmita Priyadarshini

