Hive: il modo migliore per eseguire aggiornamenti incremetali su una tabella principale

Quindi ho una tabella principale in Hive, memorizzerà tutti i miei dati.

Voglio essere in grado di caricare un aggiornamento incrementale dei dati circa ogni mese con una grande quantità di dati da un paio di miliardi di righe. Ci saranno nuovi dati e voci aggiornate.

Qual è il modo migliore per approcciarlo, so che Hive ha recentemente aggiornato e supporta l’aggiornamento / inserimento / cancellazione.

Quello che stavo pensando è in qualche modo trovare le voci che verranno aggiornate e rimuoverle dalla tabella principale e quindi inserire semplicemente il nuovo aggiornamento incrementale. Tuttavia dopo aver provato questo, gli inserti sono molto veloci, ma le eliminazioni sono molto lente.

L’altro modo è di fare qualcosa usando l’istruzione update per abbinare i valori chiave della tabella principale e l’aggiornamento incrementale e aggiornare i loro campi. Non ho ancora provato questo. Anche questo sembra dolorosamente lento dato che Hive dovrebbe aggiornare ogni voce 1 per 1.

Qualcuno ha qualche idea su come farlo in modo più efficiente ed efficace ?? Sono abbastanza nuovo per Hive e database in generale.

Se non è ansible aggiornare in modalità ACID utilizzando MERGE , è ansible aggiornare utilizzando FULL OUTER JOIN. Per trovare tutte le voci che verranno aggiornate è necessario unire i dati di incremento con i vecchi dati:

 insert overwrite target_data [partition() if applicable] SELECT --select new if exists, old if not exists case when i.PK is not null then i.PK else t.PK end as PK, case when i.PK is not null then i.COL1 else t.COL1 end as COL1, ... case when i.PK is not null then i.COL_n else t.COL_n end as COL_n FROM target_data t --restrict partitions if applicable FULL JOIN increment_data i on (t.PK=i.PK); 

È ansible ottimizzarlo limitando le partizioni in target_data che verranno sovrascritte e aggiunte.

Inoltre, se si desidera aggiornare tutte le colonne con nuovi dati, è ansible applicare questa soluzione con UNION ALL+row_number() : https://stackoverflow.com/a/44755825/2700344