Mit Pentaho Kettle, wie lade ich mehrere Tabellen aus einer einzigen Tabelle, während die referenzielle Integrität?
Benötigen Sie zum laden von Daten aus einer einzigen Datei mit mehr als 100.000 Datensätze in mehrere Tabellen auf der MySQL-Aufrechterhaltung der Beziehungen definiert in der Datei/Tabellen; Bedeutung der Beziehungen bereits übereinstimmen. Die Lösung sollte auf die neueste version von MySQL, und muss die Verwendung der InnoDB-engine; MyISAM unterstützt keine Fremdschlüssel.
Ich bin komplett neu mit Pentaho Data Integration (aka Kessel) und alle Hinweise wären sehr willkommen.
Könnte ich hinzufügen, ist es erforderlich, dass der foreign key-Einschränkungen werden NICHT deaktiviert. Da es mein Verständnis, dass wenn es etwas falsch mit der Datenbank ist die Referentielle Integrität wird MySQL keine Prüfung auf Referentielle Integrität, wenn die foreign key constraints wieder aktiviert sind. QUELLE: 5.1.4. Server-Systemvariablen -- foreign_key_checks
Alle Ansätze sollten auch einige aus der Validierung und eine rollback-Strategie sollte eine insert-fail, oder nicht, um die referenzielle Integrität zu erhalten.
Wieder, ganz neu hier und Tue mein bestes, um so viele Informationen wie möglich, wenn Sie Fragen haben, oder bitte um Aufklärung -- lasst es mich einfach wissen.
Wenn Sie in der Lage sind zu posten das XML von der kjb-und ktr-Dateien (jobs/Transformationen), das wäre SUPER. Vielleicht sogar jagen jeden Kommentar/Antwort, Sie haben alle irgendwo gemacht und bis Sie Stimmen... 🙂 ...wirklich, es ist mir wirklich wichtig, eine Antwort zu finden.
Dank!
Beispieldaten: besser erarbeiten an einem Beispiel, nehmen wir an ich bin versucht, eine Datei zu laden mit Mitarbeiter-Namen, die Büros, die Sie besetzt haben in der Vergangenheit und Ihre Job-Titel Geschichte durch einen Tabulator getrennt.
Datei:
EmployeeName<tab>OfficeHistory<tab>JobLevelHistory
John Smith<tab>501<tab>Engineer
John Smith<tab>601<tab>Senior Engineer
John Smith<tab>701<tab>Manager
Alex Button<tab>601<tab>Senior Assistant
Alex Button<tab>454<tab>Manager
HINWEIS: Die einzelne Tabelle Datenbank ist vollständig normalisiert (so viel wie eine einzelne Tabelle kann) -- und zum Beispiel im Fall von "John Smith" gibt es nur einen John Smith; D. H. es sind keine Duplikate, das würde zu Konflikten führen, in die referenzielle Integrität.
Den MyOffice
Datenbank-schema hat die folgende Tabellen:
Employee (nId, name)
Office (nId, number)
JobTitle (nId, titleName)
Employee2Office (nEmpID, nOfficeId)
Employee2JobTitle (nEmpId, nJobTitleID)
So, in diesem Fall. die Tabellen sollten so Aussehen:
Employee
1 John Smith
2 Alex Button
Office
1 501
2 601
3 701
4 454
JobTitle
1 Engineer
2 Senior Engineer
3 Manager
4 Senior Assistant
Employee2Office
1 1
1 2
1 3
2 2
2 4
Employee2JobTitle
1 1
1 2
1 3
2 4
2 3
Hier ist die MySQL-DDL zum erstellen der Datenbank und Tabellen:
create database MyOffice2;
use MyOffice2;
CREATE TABLE Employee (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(50) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE Office (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
office_number INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE JobTitle (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
title CHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE Employee2JobTitle (
employee_id MEDIUMINT NOT NULL,
job_title_id MEDIUMINT NOT NULL,
FOREIGN KEY (employee_id) REFERENCES Employee(id),
FOREIGN KEY (job_title_id) REFERENCES JobTitle(id),
PRIMARY KEY (employee_id, job_title_id)
) ENGINE=InnoDB;
CREATE TABLE Employee2Office (
employee_id MEDIUMINT NOT NULL,
office_id MEDIUMINT NOT NULL,
FOREIGN KEY (employee_id) REFERENCES Employee(id),
FOREIGN KEY (office_id) REFERENCES Office(id),
PRIMARY KEY (employee_id, office_id)
) ENGINE=InnoDB;
Meine Notizen in Reaktion auf die Ausgewählte Antwort:
PREP:
- (a) Verwenden Sie die Beispiel-Daten, erstellen Sie eine CSV-durch die änderung
<TAB>
zu ein Komma getrennt. - (b) Installieren Sie MySQL und erstellen Beispiel-Datenbank mit dem MySQL-DDL-Probe
- (c) Installieren Sie den Wasserkocher (es ist Java basiert und läuft auf alles, was läuft Java)
- (d) KTR Download-Datei
Datenfluss von Schritt: (Meine Notizen)
- Öffnen Sie die KTR-Datei im Wasserkocher, und ein Doppelklick auf die CSV-Datei input" und navigieren Sie zu der CSV-Datei, die Sie erstellt haben. Das Trennzeichen sollte bereits eingerichtet sein, um das Komma. Klicken Sie dann auf OK.
- Doppel-klicken Sie auf "Einfügen " Mitarbeiter" und wählen Sie DB-Anschluss befolgen Sie diese Anweisungen, Erstellen Sie eine Neue Datenbank-Verbindung
InformationsquelleAutor der Frage blunders | 2010-11-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich zusammen eine Probe transformation(mit der rechten Maustaste und wählen Sie " link speichern) basierend auf dem, was Sie zur Verfügung gestellt. Der einzige Schritt, ich fühle mich ein bisschen unsicher auf den letzten Tisch Eingänge. Ich bin im Grunde schreiben Sie die join-Daten an den Tisch und lassen es scheitern, wenn eine spezifische Beziehung bereits vorhanden ist.
Hinweis:
Diese Lösung nicht wirklich treffen, "Alle Ansätze, die etwas von der Validierung und eine rollback-Strategie sollte eine insert-fail, oder nicht, um die referenzielle Integrität zu erhalten." Kriterien, obwohl es wahrscheinlich nicht scheitern. Wenn Sie wirklich wollen, um das setup etwas komplexer, wir können aber dies sollte auf jeden Fall erhalten Sie gehen mit diesen Veränderungen.
Datenfluss von Schritt
1. Beginnen wir mit dem Lesen in der Datei. In meinem Fall habe ich konvertiert es zu CSV aber tab ist auch in Ordnung.
2. Jetzt gehen wir zum einfügen der Namen der Mitarbeiter in die Tabelle Employee mit einem
combination lookup/update
.Nach dem einfügen wir fügen Sie den Feld "employee_id" für unsere datastream als
id
und entfernen Sie dieEmployeeName
aus dem Datenstrom.3. Hier sind wir nur mit einer Select-Werte Schritt zu benennen
id
Feld zu Feld "employee_id"4. Legen Sie Job-Titel, genau wie Mitarbeiter und fügen Sie den Titel-id zu unserem datastream auch das löschen der
JobLevelHistory
aus dem Datenstrom.5. Einfaches umbenennen der Titel-id zu title_id(siehe Schritt 3)
6. Legen Büros, get id ' s entfernen OfficeHistory aus dem stream.
7. Einfaches umbenennen der office-id office_id(siehe Schritt 3)
8. Kopieren von Daten aus dem letzten Schritt in zwei Ströme mit den Werten
employee_id,office_id
undemployee_id,title_id
beziehungsweise.9. Verwenden Sie eine Tabelle einfügen zum einfügen der Verknüpfung von Daten. Ich habe es gewählt, Sie zu ignorieren insert-Fehler, wie konnte es sein, Duplikate und der PK-Marker wird einige Zeilen scheitern.
Output-Tabellen
InformationsquelleAutor der Antwort rwilliams