Usando il bollitore di pentaho, come si carica più tabelle da una singola tabella mantenendo l'integrità referenziale?

StackOverflow https://stackoverflow.com/questions/4175566

  •  09-10-2019
  •  | 
  •  

Domanda

È necessario caricare i dati da un singolo file con un record di oltre 100.000 in più tabelle su MySQL mantenendo le relazioni definite nel file/tabelle; Significa che le relazioni corrispondono già. La soluzione dovrebbe funzionare sull'ultima versione di MySQL e deve utilizzare il motore InnoDB; Myisam non supporta le chiavi straniere.

Sono completamente nuovo nell'uso dell'integrazione dei dati di Pentaho (aka Kettle) e qualsiasi puntatore sarebbe apprezzato.

Potrei aggiungere che è un requisito che i vincoli chiave estere non siano disabilitati. Dal momento che ho capito che se c'è qualcosa di sbagliato nell'integrità referenziale del database, MySQL non verificherà l'integrità referenziale quando i vincoli chiave esterni vengono attivati. FONTE: 5.1.4. Variabili di sistema server - straniero_key_checks

Tutti gli approcci dovrebbero includere alcuni di convalida e una strategia di rollback in caso di fallimento di inserimento o non mantenere l'integrità referenziale.

Ancora una volta, completamente nuovo a questo, e fare del mio meglio per fornire quante più informazioni possibili, se hai domande o richieste di chiarimenti, fammi sapere.

Se sei in grado di pubblicare l'XML dai file KJB e KTR (lavori/trasformazioni) che sarebbero super. Potrei anche dare la caccia a ogni commento/risposta che hai fatto ogni ovunque e votarli ... :-) ... Davvero, è davvero importante per me trovare una risposta per questo.

Grazie!


Dati di esempio: Per elaborare meglio con un esempio, supponiamo che sto cercando di caricare un file contenente il nome del dipendente, gli uffici che hanno occupato in passato e la cronologia del titolo professionale separate da una scheda.

File:

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

NOTA: Il database della tabella singola è completamente normalizzato (per quanto possa essere una singola tabella) - e ad esempio, nel caso di "John Smith" c'è solo un John Smith; Significa che non ci sono duplicati che porterebbero a conflitti nell'integrità referenziale.

Il MyOffice Lo schema del database ha le seguenti tabelle:

Employee (nId, name)
Office (nId, number)
JobTitle (nId, titleName)
Employee2Office (nEmpID, nOfficeId)
Employee2JobTitle (nEmpId, nJobTitleID)

Quindi in questo caso. i tavoli dovrebbero apparire:

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

Ecco il MySQL DDL per creare il database e le tabelle:

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;



I miei appunti in risposta alla risposta selezionata:

Prep:

  1. (a) Utilizzare i dati di esempio, creare un CSV modificando <TAB> alla virgola delimitata.
  2. (b) Installa MySQL e crea un database di esempio utilizzando il campione MySQL DDL
  3. (c) Installa il bollitore (è basato su Java e funzionerà su tutto ciò che esegue Java)
  4. (d) Scarica il file KTR

Flusso di dati per passo: (I miei appunti)

  1. Apri il file KTR nel bollitore e ha fatto doppio clic sull'input "File CSV" e naviga nel file CSV creato. Il delimitatore dovrebbe già essere impostato su virgola. Quindi fai clic su Ok.
  2. Fare doppio clic su "Inserisci dipendenti" e seleziona DB Connettore, quindi segui queste direzioni su Creazione di una nuova connessione al database
È stato utile?

Soluzione

Ho messo insieme un campione trasformazione (clic destro e scegli Salva link) Basato su ciò che hai fornito. L'unico passo su cui mi sento un po 'incerto sono gli ultimi input della tabella. Fondamentalmente sto scrivendo i dati di join alla tabella e lasciandolo fallire se esiste già una relazione specifica.

Nota:

Questa soluzione non soddisfa davvero "tutti gli approcci dovrebbero includere alcuni di convalida e una strategia di rollback in caso di fallimento di inserimento o non mantenere l'integrità referenziale". criteri, anche se probabilmente non fallirà. Se vuoi davvero impostare qualcosa di complesso che possiamo, ma questo dovrebbe sicuramente farti andare con queste trasformazioni.

alt text

Flusso di dati per passo

1. Iniziamo con la lettura nel tuo file. Nel mio caso l'ho convertito in CSV ma anche la scheda va bene.alt text

2. Ora inseriremo i nomi dei dipendenti nella tabella dei dipendenti usando un combination lookup/update. Dopo l'inserto aggiungiamo il dipendente_id al nostro dataStream come id e rimuovere il EmployeeName dal flusso di dati.

alt text

3. Qui stiamo solo usando un passaggio valori selezionati per rinominare il id campo al dipendente_idalt text

4. Inserire i titoli di lavoro proprio come abbiamo fatto dipendenti e aggiungere l'ID titolo al nostro Datastream eliminando anche il JobLevelHistory dal DataStream.

alt text

5. Semplice rinominare l'ID titolo su title_id (vedi passaggio 3)alt text

6. Inserisci uffici, ottieni ID, rimuovi Office History dal flusso.

alt text

7. Semplice rinominare l'ID Office su Office_ID (vedi passaggio 3)

alt text

8. Copia i dati dall'ultimo passaggio in due flussi con i valori employee_id,office_id e employee_id,title_id rispettivamente.

alt text alt text

9. Utilizzare un inserto da tabella per inserire i dati di join. L'ho selezionato per ignorare gli errori di inserimento in quanto potrebbero esserci duplicati e i vincoli PK faranno fallire alcune righe.

Tabelle di output

alt text

alt text

alt text

alt text

alt text

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top