Für langsam veränderliche Dimensionen - SCD1 und SCD2 Umsetzung in Hive
Ich bin auf der Suche nach SCD1 und SCD2 Umsetzung in Struktur (1.2.1). Ich bin mir bewusst, Abhilfe zu laden, SCD1 und SCD2 Tabellen vor zu Hive (0.14). Hier ist der link für das laden von SCD1 und SCD2 mit dem workaround-Ansatz http://hortonworks.com/blog/four-step-strategy-incremental-updates-hive/
Nun, dass Hive unterstützt die SÄURE-Operationen möchte nur wissen, ob es eine bessere oder direkte Art und Weise zu laden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als HDFS ist unveränderlich Lagerung, könnte es argumentiert werden, dass die Versionierung von Daten und Geschichte (SCD2) sollte das Standard-Verhalten für das laden von Dimensionen. Sie können eine Ansicht erstellen, in Ihre Hadoop-SQL-Abfrage-engine (Hive, Impala, Drill -, etc.) ruft den aktuellen Stand/die Letzte den Wert mithilfe von Window-Funktionen. Sie können herausfinden, mehr über dimensionale Modelle auf Hadoop in meinem blog-Beitrag, wie z.B. den Umgang mit einer großen dimension und der Faktentabelle.
Gut, ich arbeite es um die Verwendung von zwei temporären Tabellen:
Hier ist die detaillierte Umsetzung der langsam veränderlichen dimension Typ-2-Hive mit exklusiven join-Ansatz.
Unter der Annahme, dass die Quelle das senden einer kompletten Daten-Datei, also alte, aktualisierte und neue Datensätze.
Laden der letzten Datei die Daten zum STG Tabelle
Wählen Sie alle abgelaufen Datensätze aus HIST Tabelle
select * from HIST_TAB where exp_dt != '2099-12-31'
Wählen Sie alle Datensätze, die nicht geändert von STG und HIST mit inner join und filter auf HIST.Spalte = STG.Spalte, wie unten
select hist.* from HIST_TAB hist
inner join STG_TAB stg
on hist.key = stg.key
where hist.column = stg.column
Wählen Sie alle neue und aktualisierte Datensätze, die geändert STG_TAB mit exklusiven left join mit HIST_TAB und legen Sie Ablauf und Zeitpunkt des Inkrafttretens, wie unten
select stg.*, eff_dt (yyyy-MM-dd), exp_dt (2099-12-31)
from STG_TAB stg
left join
(select * from HIST_TAB where exp_dt = '2099-12-31') hist
on hist.key = stg.key
where hist.key is null
or hist.column != stg.column
Wählen Sie alle aktualisiert, alte Datensätze aus der HIST Tabelle mit exklusiven left join mit der STG-Tabelle und legen deren Ablauf-Datum wie gezeigt, unten:
select hist.*, exp_dt(yyyy-MM-dd) from
(select * from HIST_TAB where exp_dt = '2099-12-31') hist
left join STG_TAB stg
on hist.key= stg.key
where hist.key is null
or hist.column!= stg.column
unionall
Abfragen von 2-5 einfügen und überschreiben Ergebnis HIST TabelleMehr detaillierte Umsetzung des SCD Typ 2 finden Sie hier-
https://github.com/sahilbhange/slowly-changing-dimension
Habe ich einen weiteren Ansatz verwenden, wenn Sie kommen, um die Verwaltung der Daten mit
SCDs
:Nie aktualisieren von Daten, das existiert in Ihrem historischen Datei oder Tabelle.
Stellen Sie sicher, dass die neuen Zeilen werden im Vergleich zu der jüngsten generation, zum Beispiel das load-Logik hinzufügen-control Spalten :
loaded_on
,checksum
und, falls erforderlich, eine Sequenz Spalte, die verwendet werden, wenn mehrere Belastungen auftreten, werden die gleichen Tag-Vergleich neue Daten zur jüngsten generation, sowohl die Kontrolle von Spalten und eine Spalte "Schlüssel", das existiert, inside Ihre Daten wie Kunde oder Produkt-key.Nun, die Magie erfolgt durch Berechnung der
checksum
alle die Spalte beteiligt, aber die Kontrolle von Spalten, die Schaffung eines einzigartigen Fingerabdruck für jede Zeile. Das finger-print (checksum
) - Spalte werden dann genutzt, um zu bestimmen, wenn keine Spalten geändert haben, im Vergleich zu der aktuellen generation (aktuellste generation ist auf dem neuesten Stand der Daten, basierend auf dem Schlüssel, loaded_on und Reihenfolge).Nun, wissen Sie, wenn eine Zeile aus Ihrem täglichen update ist neu, da keine der früheren generation, oder, wenn eine Zeile aus Ihrem täglichen Updates benötigen, um erstellen Sie eine neue Zeile (neue generation) in Ihren historischen Datei oder Tabelle und die letzten, wenn eine Zeile aus Ihrem täglichen update nicht alle änderungen, also keine Notwendigkeit, erstellen Sie eine Zeile, da ist kein Unterschied im Vergleich zur vorherigen generation.
Die Art von Logik, die erforderlich werden können, bauen mit
Apache Spark
, in einer einzigen Anweisung können Sie FragenSpark
die Verkettung einer beliebigen Anzahl von Spalten allerdatatypes
dann berechnen Sie einhash
Wert, der verwendet wird, um finger-print-it.Alles zusammen jetzt können Sie entwickeln ein Dienstprogramm basierend auf
spark
wird akzeptieren, dass jeder Daten-Quelle und-Ausgabe ein gut organisiert, sauber und langsam Dimensionen bewusst historische Datei, Tabelle,... die Letzte, nie update append only!