20231010 hive count(*) 查询为0
一、问题现象
执行count(*) 发现统计结果为0,但是是有数据的。

count(*)的执行结果不对
二、影响范围
所有dataX 接入的hive表
三、问题原因
发现是count(*) 应该是直接查询的hive元数据,并没有实际查询数据来进行统计,那么问题的原因就是为啥元数据里面没有这个统计信息呢?
查询资料发现有参数会控制这个 insert overwrite 来统计分区信息的情况,查看也是开启的
set hive.stats.autogather;

但是这个表是通过 datax 接入的 那么dataX 接入的时候是没有hive write 插件的,所以使用的hdfs插件 然后走的是 add partitions 的方式加的分区。
所有手动执行ANALYZE TABLE stage.stage_scheduler_task_instance_df PARTITION(dt='20231008',rgn='cn') COMPUTE STATISTICS 之后在查询发现在查询元数据的方式就查询到了。
所以解决这个问题,要不在datax 端添加 ANALYZE TABLE ,要不就关闭 查询元数据的操作。关闭这个参数这有一个缺点就是浪费一些性能,不过查询的数据更准确了。
set hive.compute.query.using.stats =false;
四、解决问题
由于 ANALYZE TABLE 在多线程并发执行的时候 会存在挂载分区失败的情况:analyze 导致的分区挂载错误
所以就不能通过关闭查询元数据来解决问题了,需要解决
修改hive-site.xml 参数 hive.compute.query.using.stats =false; 关闭查询元数据的方式来解决这个问题
重启hiveServer2 服务即可