4
votes

Combiner les données d'une table dans la ruche

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


5 commentaires

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.


3 Réponses :


4
votes

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 >


1 commentaires

Merci mais avoir une erreur. Je l'ai mis à jour comme "Update_2".



4
votes

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;


0 commentaires

3
votes

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;


1 commentaires

Merci pour l'explication. C'est le plus simple et le plus efficace.