*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中文网其他相关文章!