2017-09-26 12 views
1

J'ai le tableau suivant qui obtient des mises à jour incrémentielles. J'ai besoin d'écrire une requête Hive normale pour fusionner les lignes avec la même valeur de clé avec les valeurs les plus récentes.Fusion d'enregistrements en double sur la table Hive

Key | A | B | C | Timestamp 
K1 | X | Null | Null | 2015-05-03 
K1 | Null | Y | Z | 2015-05-02 
K1 | Foo | Bar | Baz | 2015-05-01 

Vous le voulez:

Key | A | B | C | Timestamp 
K1 | X | Y | Z | 2015-05-03 
+0

Première pensée - coalescent, mais je ne pense pas que ce soit correct –

+0

si la colonne sont moins vous pouvez essayer de la ruche ne supporte pas de nouveau appel CTE pour créer un nouveau CTE vous devez créer une nouvelle table ou dans le stockage de garniture. alors j'ai un peu de soln .. –

Répondre

0

Utilisez la fonction first_value() pour obtenir la dernière valeur non nulle. Nécessité de concaténer les clés de tri car last_value ne fonctionne qu'avec une seule clé de tri.

Démo:

select distinct 
key, 
first_value(A) over (partition by Key order by concat(case when A is null then '1' else '2' end,'_',Timestamp)desc) A, 
first_value(B) over (partition by Key order by concat(case when B is null then '1' else '2' end,'_',Timestamp)desc) B, 
first_value(C) over (partition by Key order by concat(case when C is null then '1' else '2' end,'_',Timestamp)desc) C, 
max(timestamp) over(partition by key) timestamp 
from 
( ---------Replace this subquery with your table 
select 'K1' key, 'X' a, Null b, Null c, '2015-05-03' timestamp union all 
select 'K1' key, null a, 'Y'  b, 'Z' c, '2015-05-02' timestamp union all 
select 'K1' key, 'Foo' a, 'Bar' b, 'Baz' c, '2015-05-01' timestamp 
)s 
; 

Sortie:

OK 
key  a  b  c  timestamp 
K1  X  Y  Z  2015-05-03