You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Trino查询Hive外部表时遇ORC文件格式错误求助

Trino查询Hive外部表ORC文件报错:无法从STRING类型流读取double类型

问题场景

执行查询语句 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:15:33