Hive中使用count(1)统计行数问题

环境

  • hadoop 3.3.4
  • jdk 1.8.0_201
  • hive 3.1.3

原因

因为执行count(1)或count(*)统计行数时,默认会从Hive的元数据库中查询 rowsNum 对应值作为结果返回,一般情况下,如果是使用加载数据文件load data的方式填充表数据,则不会收集此统计信息,Hive收集的统计信息与收集时机见官方文档

解决方案

方案一

使用ANALYZE命令手动更新表统计信息,如:

1
ANALYZE TABLE Table1 COMPUTE STATISTICS;

方案二

配置修改hive.compute.query.using.stats,它是hive的一个配置参数,用于控制在执行查询时是否使用统计信息来优化查询计划。在hive 3.1.3中,该参数的默认值是true。

如果将值设置为true时,会尝试使用表的统计信息来优化查询计划。统计信息包括表的行数、列的基数、列的最小值和最大值等。通过使用统计信息,Hive 可以更好地估计查询的成本和选择合适的执行计划,从而提高查询性能。

如果将值设置为false时,将不会使用表的统计信息来优化查询计划。如果你希望禁用统计信息的使用,可以设置为false。

这里将其设置为false。在hive的配置文件(hive-site.xml)中添加以下配置:

1
2
3
4
   <property>
     <name>hive.compute.query.using.stats</name>
     <value>false</value>
   </property>

然后重启hive

临时设置的话,在hive命令行中使用SET命令设置参数:

1
SET hive.compute.query.using.stats=false;
Buy me a coffee
支付宝
微信
0%