Heim >Datenbank >MySQL-Tutorial >Warum gibt ein Hive „COUNT(*)' mit einer Nicht-Null-Bedingung eine höhere Anzahl zurück als ein einfaches „COUNT(*)'?

Warum gibt ein Hive „COUNT(*)' mit einer Nicht-Null-Bedingung eine höhere Anzahl zurück als ein einfaches „COUNT(*)'?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-12 06:59:46317Durchsuche

Why Does a Hive `COUNT(*)` with a Non-Null Condition Return a Higher Count Than a Simple `COUNT(*)`?

*Hive-Anzahl () Ausnahme: SELECT mit einer Nicht-Null-Bedingung gibt eine höhere Anzahl zurück**

In Hive wurde ein besonderes Verhalten beobachtet: Die Zeilenanzahl mit nicht leerer Bedingung gab einen höheren Wert zurück als die Anzahl aller Zeilen. Lassen Sie uns diese Anomalie untersuchen.

Die Tabelle mit dem Namen „mytable“ enthält ein Feld mit dem Namen „master_id“. Mit der Funktion count(*) erhalten wir:

<code class="language-sql">select count(*) as c from mytable;
c
1129563</code>

Wenn wir jedoch eine Bedingung hinzufügen, um nur Nicht-Null-Werte von „master_id“ zu zählen, erhalten wir eine viel größere Anzahl:

<code class="language-sql">select count(*) as c from mytable where master_id is not null;
c
1134041</code>

Überraschenderweise zeigt eine separate Abfrage, dass „master_id“ keine Nullwerte hat:

<code class="language-sql">select count(*) as c from mytable where master_id is null;
c
0</code>

Warum führt das Hinzufügen einer Nicht-Null-Bedingung zu einer höheren Anzahl, wenn keine Nullwerte vorhanden sind?

Die wahrscheinlichste Erklärung liegt in den Hive-Nutzungsstatistiken. Standardmäßig verwendet Hive Statistiken, um die Abfrageplanung durch Schätzung der Anzahl der Zeilen zu optimieren. Allerdings sind diese Statistiken nicht immer korrekt.

Um dieses Problem zu lösen, deaktivieren Sie die Verwendung von Statistiken, indem Sie den Parameter festlegen:

<code class="language-sql">set hive.compute.query.using.stats=false;</code>

Eine erneute Ausführung der Abfrage sollte nun zu konsistenten Ergebnissen führen.

Alternativ können Sie Statistiken manuell mithilfe der ANALYZE TABLE-Syntax berechnen.

Darüber hinaus werden durch die Einstellung hive.stats.autogather=true automatisch Statistiken während INSERT OVERWRITE Vorgängen erfasst, um genauere Statistiken zu gewährleisten und solche Anomalien zu verhindern.

Das obige ist der detaillierte Inhalt vonWarum gibt ein Hive „COUNT(*)' mit einer Nicht-Null-Bedingung eine höhere Anzahl zurück als ein einfaches „COUNT(*)'?. 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