Spark SQL与Hive SQL执行同一条查询返回结果不一致问题求助
Hive与Spark SQL查询结果不一致问题根因及解决方法
该问题是Hive和Spark序列化兼容的典型场景,常见触发原因及验证方案如下:
常见根因
1. Parquet序列化器兼容性问题
这个是该类问题的最高发原因:Hive 1.x/2.1之前版本写入Double类型到Parquet文件时,对极小浮点值、写入时触发过隐式类型转换的数值,会生成符合Hive序列化规则的特殊编码;Spark默认使用内置的Parquet序列化器读取Hive元数据表,遇到不符合Spark浮点校验规则的编码时,会直接返回null,而Hive原生读逻辑会兼容该类编码返回0.0或原始存储值。
2. 类型校验规则差异
Hive对解析失败的数值类型默认做降级处理,非法浮点编码会返回0.0;而Spark开启严格类型校验(默认开启)时,解析失败的数值会直接返回null,不会做降级兼容。
3. 表底层存储格式不统一
如果表的不同分区使用了不同的存储格式(如部分为TextFile、部分为Parquet),或者不同分区是由不同版本的Hive/Spark写入,也会出现部分行的字段解析结果不一致的问题。
验证及修复方案
- 首先在Spark Session启动时添加以下两个配置,重新执行查询验证结果是否和Hive一致:
如果调整配置后结果对齐,即可确认是Parquet序列化兼容问题。spark.sql.hive.convertMetastoreParquet=false spark.sql.parquet.enableVectorizedReader=false - 确认出现异常的15个列的字段类型,若均为Float/Double等浮点类型,可以进一步佐证序列化兼容的问题定位。
- 长期修复可以统一全表的写入引擎和存储格式,避免多版本引擎混合写入产生的编码兼容问题。
内容的提问来源于stack exchange,提问作者Zhijun Liu
相关产品推荐
相关产品推荐

