집 >데이터 베이스 >MySQL 튜토리얼 >Null이 아닌 값을 필터링한 후 내 하이브 'COUNT(*)'가 증가하는 이유는 무엇입니까?
*Hive의 `COUNT()` 필터링 후 예상치 못한 결과 발생**
Hive의 COUNT(*)
기능을 사용하면 때로는 놀라운 결과가 나올 수 있습니다. "master_id" 열이 있는 "mytable" 테이블을 생각해 보세요.
초기 개수 쿼리에서는 1,129,563개의 행이 표시됩니다.
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable;</code>
그러나 null이 아닌 "master_id" 값을 필터링하면 개수가 예기치 않게 1,134,041로 증가합니다.
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NOT NULL;</code>
이것은 특히 null "master_id" 값을 검사하는 쿼리가 0을 반환하기 때문에 매우 혼란스럽습니다.
<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>
자동 통계 수집 활성화: INSERT OVERWRITE
작업 중에 통계를 자동으로 업데이트하도록 Hive를 구성합니다.
<code class="language-sql">SET hive.stats.autogather=true;</code>
이러한 방법 중 하나를 구현하면 COUNT(*)
쿼리가 일관되게 정확한 행 수를 반환하도록 할 수 있습니다.
위 내용은 Null이 아닌 값을 필터링한 후 내 하이브 'COUNT(*)'가 증가하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!