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
Freigeben: 2025-01-12 06:59:46
Original
298 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Ü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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage