*Hive 的 `COUNT()` 过滤后产生意外结果**
使用 Hive 的 COUNT(*)
函数有时会产生令人惊讶的结果。 考虑一个表“mytable”,其中有一列“master_id”。
初始计数查询显示 1,129,563 行:
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable;</code>
但是,过滤非空“master_id”值会意外地将计数增加到 1,134,041:
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NOT NULL;</code>
这是令人费解的,特别是因为检查空“master_id”值的查询返回零:
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NULL;</code>
差异背后的原因
这种不一致源于 Hive 依赖表统计信息来进行查询优化。 缺少 COUNT(*)
子句的初始 WHERE
查询可能会使用估计统计信息而不是全表扫描。 添加 WHERE
子句会强制执行完整的表扫描,从而获得精确且更高的行数。
如何获得准确的计数
为了保证准确的结果,请考虑以下解决方案:
禁用基于统计的优化:防止 Hive 使用统计进行查询优化:
<code class="language-sql">SET hive.compute.query.using.stats=false;</code>
手动更新表统计信息:使用ANALYZE TABLE
命令刷新表的统计信息:
<code class="language-sql">ANALYZE TABLE mytable COMPUTE STATISTICS;</code>
启用自动统计信息收集: 配置 Hive 在 INSERT OVERWRITE
操作期间自动更新统计信息:
<code class="language-sql">SET hive.stats.autogather=true;</code>
通过实施其中一种方法,您可以确保您的 COUNT(*)
查询始终返回准确的行计数。
以上是为什么我的 Hive'COUNT(*)”在过滤非空值后会增加?的详细内容。更多信息请关注PHP中文网其他相关文章!