首页 > 数据库 > mysql教程 > 为什么具有非空条件的 Hive'COUNT(*)”返回的计数高于简单的'COUNT(*)”?

为什么具有非空条件的 Hive'COUNT(*)”返回的计数高于简单的'COUNT(*)”?

Mary-Kate Olsen
发布: 2025-01-12 06:59:46
原创
297 人浏览过

Why Does a Hive `COUNT(*)` with a Non-Null Condition Return a Higher Count Than a Simple `COUNT(*)`?

*Hive计数()异常:带非空条件的SELECT返回更高的计数**

在Hive中,观察到一种特殊行为:带有非空条件的行计数返回的值高于所有行的计数。让我们来调查一下这个异常。

名为“mytable”的表包含一个名为“master_id”的字段。使用count(*)函数,我们得到:

<code class="language-sql">select count(*) as c from mytable;
c
1129563</code>
登录后复制

但是,当添加一个条件来仅计算“master_id”的非空值时,我们得到一个更大的计数:

<code class="language-sql">select count(*) as c from mytable where master_id is not null;
c
1134041</code>
登录后复制

令人惊讶的是,一个单独的查询显示“master_id”没有空值:

<code class="language-sql">select count(*) as c from mytable where master_id is null;
c
0</code>
登录后复制

为什么在没有空值的情况下,添加非空条件会产生更高的计数?

最可能的解释在于Hive使用统计信息。默认情况下,Hive利用统计信息通过估计行数来优化查询规划。但是,这些统计信息并不总是准确的。

为了解决这个问题,通过设置参数来禁用统计信息的用法:

<code class="language-sql">set hive.compute.query.using.stats=false;</code>
登录后复制

重新执行查询现在应该会产生一致的结果。

或者,您可以使用ANALYZE TABLE语法手动计算统计信息。

此外,设置hive.stats.autogather=true将在INSERT OVERWRITE操作期间自动收集统计信息,确保更准确的统计信息并防止此类异常。

以上是为什么具有非空条件的 Hive'COUNT(*)”返回的计数高于简单的'COUNT(*)”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板