Heim >Datenbank >MySQL-Tutorial >Warum erhöht sich mein Hive „COUNT(*)' nach der Filterung nach Nicht-Null-Werten?

Warum erhöht sich mein Hive „COUNT(*)' nach der Filterung nach Nicht-Null-Werten?

DDD
DDDOriginal
2025-01-12 10:55:44384Durchsuche

Why Does My Hive `COUNT(*)` Increase After Filtering for Non-Null Values?

*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:

  1. Statistikbasierte Optimierung deaktivieren: Verhindern Sie, dass Hive Statistiken zur Abfrageoptimierung verwendet:

    <code class="language-sql">SET hive.compute.query.using.stats=false;</code>
  2. Tabellenstatistiken manuell aktualisieren: Verwenden Sie den Befehl ANALYZE TABLE, um die Tabellenstatistiken zu aktualisieren:

    <code class="language-sql">ANALYZE TABLE mytable COMPUTE STATISTICS;</code>
  3. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn