*`COUNT()` de Hive donne des résultats inattendus après filtrage**
Utiliser la fonction COUNT(*)
de Hive peut parfois produire des résultats surprenants. Considérons une table, "mytable", avec une colonne "master_id".
Une requête de décompte initiale révèle 1 129 563 lignes :
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable;</code>
Cependant, le filtrage des valeurs "master_id" non nulles augmente de manière inattendue le nombre à 1 134 041 :
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NOT NULL;</code>
C'est déroutant, d'autant plus qu'une requête vérifiant les valeurs nulles de "master_id" renvoie zéro :
<code class="language-sql">SELECT COUNT(*) AS c FROM mytable WHERE master_id IS NULL;</code>
La raison derrière l'écart
Cette incohérence provient de la dépendance de Hive aux statistiques de table pour l'optimisation des requêtes. La requête COUNT(*)
initiale, dépourvue de clause WHERE
, peut utiliser des statistiques estimées au lieu d'une analyse complète de la table. L'ajout de la clause WHERE
force une analyse complète de la table, conduisant à un nombre de lignes précis et plus élevé.
Comment obtenir des décomptes précis
Pour garantir des résultats précis, envisagez ces solutions :
Désactiver l'optimisation basée sur les statistiques : Empêcher Hive d'utiliser les statistiques pour l'optimisation des requêtes :
<code class="language-sql">SET hive.compute.query.using.stats=false;</code>
Mettre à jour manuellement les statistiques du tableau : Utilisez la commande ANALYZE TABLE
pour actualiser les statistiques du tableau :
<code class="language-sql">ANALYZE TABLE mytable COMPUTE STATISTICS;</code>
Activer la collecte automatique de statistiques : Configurez Hive pour mettre à jour automatiquement les statistiques lors des INSERT OVERWRITE
opérations :
<code class="language-sql">SET hive.stats.autogather=true;</code>
En mettant en œuvre l'une de ces méthodes, vous pouvez vous assurer que vos COUNT(*)
requêtes renvoient systématiquement un nombre de lignes précis.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!