2017-06-23 1 views
0

Salut J'ai tableau ci-dessous Source « table d'état »Table insert Ecraser ruche avec la requête sous interne de nombre de colonnes comme résultat

date   status name 
2017-06-22  true  1.tar 
2017-06-22  true  2.tar 
2017-06-22  false  3.tar 
2017-06-22  true  4.tar 
2017-06-22  false  5.tar 
2017-06-21  false  6.tar 
2017-06-21  false  6.tar 
2017-06-21  false  6.tar 
2017-06-21  true  6.tar 

J'ai ci-dessous les colonnes de table de destination avec les données attendues

True  False  Total Date 
3  2   5  2017-06-22 
1  3   4  2017-06-21 

J'ai écrit ci-dessous requête pour charger les données de la table source à la table de destination, mais il dit

Expression not in GROUP BY key

SET hive.exec.dynamic.partition.mode=nonstrict; 
SET hive.auto.convert.join=true; 
INSERT OVERWRITE TABLE destination PARTITION(date_time) 
SELECT 
count(status=true) AS success, 
count(status=false) AS fail, 
success + fail 
FROM 
status; 

S'il vous plaît aidez-moi avec le lien manquant. Merci d'avance.

Répondre

1
  1. Ruche ne supporte pas les références des alias dans la clause SELECT (success + fail)
  2. COUNT de tout les chefs d'accusation qui n'est pas NULL. FALSE n'est pas NULL.
  3. Date est un mot réservé. utilisez `Date` ou mieux encore, trouvez un autre nom. Vous n'avez pas groupé par Date.
  4. Lors de l'utilisation du partitionnement dynamique, la ou les colonnes de partition doivent être sélectionnées, en dernier.

select count (case when status = true then 1 end) as success 
     ,count (case when status = false then 1 end) as fail 
     ,count (status)        as total 
     ,`date` 

from status 

group by `date` 
+0

Vérifiez la réponse mise à jour –

0

merci pour répondre, mais je trouve mon erreur, j'utilisais la fonction de comptage au lieu de somme. Voici le code ci-dessous.

SELECT 
sum(case when status ='true' then 1 else 0 end), 
sum(case when status ='false' then 1 else 0 end), 
sum(case when status ='true' then 1 else 0 end) + sum(case when status='false' then 1 else 0 end) 
from status where date='2017-06-21'; 
+0

Sérieusement? Comment ce code est-il lié au code erroné original que vous avez posté et à votre besoin tel que vous l'avez décrit? Et non - l'utilisation de COUNT n'est pas une erreur si vous comprenez comment cela fonctionne comme je l'ai démontré dans ma réponse. En outre, cela semble être une mauvaise façon de compter les valeurs non NULL. –

+0

Merci! J'ai essayé votre solution! Cela a fonctionné aussi, mais votre approche est plus pertinente –