Besoin de combiner les données dans une table Hive sur une seule ligne. L'intention est de capturer les données / valeurs autres que 'N'
c'est-à-dire que toute valeur présente autre que 'N'
doit être capturée pour tous les 'col1'
values
Table1:
FAILED: SemanticException [Error 10025]: Line 1:7 Expression not in GROUP BY key 'col1'
J'ai essayé avec la requête suivante:
select col1,col2,collect_set(col) from (select col1,col2,t.col from tbl lateral view explode(array(col3,col4,col5,col6)) t as col where t.col <> 'N' ) t
et j'ai obtenu ce qui suit :
O / P réel:
FAILED: SemanticException [Error 10025]: Line 2:11 Expression not in GROUP BY key 'Q'
O / P attendu:
GHY BG ['Q','T','A','Z']
Ne reçoit pas le point d'erreur :(
Update_1:
Après avoir supprimé "max" de la requête:
GHY BG ['None','None','A','None']
Update_2: p>
Select col1, col2,array( max(CASE WHEN col3 == 'Q' THEN 'Q' ELSE 'None' END), max(CASE WHEN col4 == 'T' THEN 'T' ELSE 'None' END), max(CASE WHEN col5 == 'A' THEN 'A' ELSE 'None' END), max(CASE WHEN col6 == 'Z' THEN 'Z' ELSE 'None' END)) FROM table1 GROUP BY col1,col2;
Erreur:
col1 col2 col3 col4 col5 col6 ----------------------------- GHY BG Q N N N GHY BG N T N N GHY BG N N A N GHY BG N N N Z
3 Réponses :
Utilisez exploser
pour obtenir une ligne par colonne pour une combinaison de col1, col2 et les agréger avec un collect_set
.
select col1,col2,collect_set(col) from (select col1,col2,t.col from tbl lateral view explode(array(col3,col4,col5,col6)) t as col where t.col <> 'N' ) t group by col1,col2
p >
Merci mais avoir une erreur. Je l'ai mis à jour comme "Update_2".
Cette requête produit le résultat attendu:
GHY BG ["Q","T","A","Z"]
Résultat:
with Table1 as --your test data ( select stack(4, 'GHY','BG','Q','N','N','N', 'GHY','BG','N','T','N','N', 'GHY','BG','N','N','A','N', 'GHY','BG','N','N','N','Z') as (col1, col2, col3, col4, col5, col6) ) select col1, col2,array( nvl(max(CASE WHEN col3 = 'Q' THEN 'Q' END),'None'), nvl(max(CASE WHEN col4 = 'T' THEN 'T' END),'None'), nvl(max(CASE WHEN col5 = 'A' THEN 'A' END),'None'), nvl(max(CASE WHEN col6 = 'Z' THEN 'Z' END),'None')) from Table1 group by col1, col2;
Une autre solution possible (inspirée de celles fournies) est:
['Q','T','A','Z']
Remarque:
max ()
choisira la valeur maximale . Vous devrez peut-être changer vos valeurs indésirables en quelque chose comme 'aa'
. Sinon, les autres valeurs pourraient être sélectionnées.
Exemple1:
col1 col2 col3 col4 col5 col6 ----------------------------- GHY BG Q a a a GHY BG a T a a GHY BG a a A a GHY BG a a a Z
Résultat:
['Q','T','N','Z']
Exemple2 :
col1 col2 col3 col4 col5 col6 ----------------------------- GHY BG Q N N N GHY BG N T N N GHY BG N N A N GHY BG N N N Z
Résultat:
Select col1,col2,array(concat(max(col3),max(col4),max(col5),max(col6))) group by col1,col2;
Merci pour l'explication. C'est le plus simple et le plus efficace.
Que se passe-t-il si vous supprimez le
max ()
?@Tony a mis à jour la question avec O / P. Après avoir supprimé le 'max'
Jamais le
max ()
. Je n'ai pas vérifié correctement la requête, désolé.pourquoi
N
n'est-il pas dans la sortie du tableau?@VamsiPrabhala l'a expliqué dans la question.