2016-06-08 7 views
1

So habe ich eine Haupttabelle in Hive, es speichert alle meine Daten.Hive: Der beste Weg, um inkrementelle Updates auf einer Haupttabelle zu tun

Ich möchte eine inkrementelle Datenaktualisierung über jeden Monat mit einer großen Menge an Daten paar Milliarden Zeilen laden können. Es wird neue Daten sowie aktualisierte Einträge geben.

Was ist der beste Weg, dies zu nähern, ich weiß, Hive vor kurzem aktualisieren und unterstützt Update/Einfügen/Löschen.

Was ich gedacht habe ist, die Einträge, die aktualisiert werden, irgendwie zu finden und sie aus der Haupttabelle zu entfernen und dann einfach das neue inkrementelle Update einzufügen. Nach dem Versuch sind die Inserts jedoch sehr schnell, aber die Löschvorgänge sind sehr langsam.

Die andere Möglichkeit besteht darin, mithilfe der update-Anweisung die Schlüsselwerte aus der Haupttabelle und der inkrementellen Aktualisierung abzugleichen und ihre Felder zu aktualisieren. Ich habe das noch nicht ausprobiert. Das klingt auch schmerzhaft langsam, da Hive müsste jeden Eintrag 1 um 1 zu aktualisieren.

Wer hat irgendwelche Ideen, wie dies am effizientesten und effektiv zu tun? Ich bin ziemlich neu in Hive und Datenbanken im Allgemeinen.

Antwort

4

Wenn Sie nicht im ACID-Modus aktualisieren möchten, ist es möglich, mit FULL OUTER JOIN zu aktualisieren. Um alle Einträge zu finden, die Sie benötigen werden, aktualisiert werden Inkrementdatenelement mit alten Daten verbinden:

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); 

Es ist möglich, dies zu optimieren, indem Partitionen in target_data beschränken, die überschrieben und verbunden werden.

Auch wenn Sie alle Spalten mit neuen Daten aktualisieren möchten, können Sie diese Lösung mit UNION ALL+row_number() gelten: https://stackoverflow.com/a/44755825/2700344

+0

Thank you! Das ist eine großartige Idee! – Alex