Heim >Datenbank >MySQL-Tutorial >Warum erhöht sich mein Hive „COUNT(*)' nach der Filterung nach Nicht-Null-Werten?
*Hives „COUNT()“ liefert nach dem Filtern unerwartete Ergebnisse**
Die Verwendung der COUNT(*)
-Funktion von Hive kann manchmal zu überraschenden Ergebnissen führen. Stellen Sie sich eine Tabelle „mytable“ mit einer Spalte „master_id“ vor.
Eine erste Zählabfrage ergibt 1.129.563 Zeilen:
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable;</code>
Das Filtern nach „master_id“-Werten ungleich Null erhöht die Anzahl jedoch unerwartet auf 1.134.041:
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NOT NULL;</code>
Das ist rätselhaft, insbesondere weil eine Abfrage, die nach Nullwerten für „master_id“ sucht, Null zurückgibt:
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NULL;</code>
Der Grund für die Diskrepanz
Diese Inkonsistenz ist darauf zurückzuführen, dass Hive sich bei der Abfrageoptimierung auf Tabellenstatistiken verlässt. Die anfängliche COUNT(*)
-Abfrage, der eine WHERE
-Klausel fehlt, verwendet möglicherweise geschätzte Statistiken anstelle eines vollständigen Tabellenscans. Das Hinzufügen der WHERE
-Klausel erzwingt einen vollständigen Tabellenscan, was zu einer präzisen und höheren Zeilenanzahl führt.
So erhalten Sie genaue Zählungen
Um genaue Ergebnisse zu gewährleisten, ziehen Sie diese Lösungen in Betracht:
Statistikbasierte Optimierung deaktivieren: Verhindern Sie, dass Hive Statistiken zur Abfrageoptimierung verwendet:
<code class="language-sql">SET hive.compute.query.using.stats=false;</code>
Tabellenstatistiken manuell aktualisieren: Verwenden Sie den Befehl ANALYZE TABLE
, um die Tabellenstatistiken zu aktualisieren:
<code class="language-sql">ANALYZE TABLE mytable COMPUTE STATISTICS;</code>
Automatische Statistikerfassung aktivieren: Hive so konfigurieren, dass Statistiken während INSERT OVERWRITE
Vorgängen automatisch aktualisiert werden:
<code class="language-sql">SET hive.stats.autogather=true;</code>
Durch die Implementierung einer dieser Methoden können Sie sicherstellen, dass Ihre COUNT(*)
Abfragen stets genaue Zeilenzahlen zurückgeben.
Das obige ist der detaillierte Inhalt vonWarum erhöht sich mein Hive „COUNT(*)' nach der Filterung nach Nicht-Null-Werten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!