Используя Pentaho Kettle, как загрузить несколько таблиц из одной таблицы, сохраняя при этом ссылочную целостность?

нужно загрузить данные из одного файла с записями 100,000+ в несколько таблиц на MySQL, поддерживая отношения, определенные в файле / таблицах; это означает, что отношения уже совпадают. Решение должно работать на последней версии MySQL и должно использовать движок InnoDB; MyISAM не поддерживает внешние ключи.

Я совершенно новичок в использовании интеграции данных Pentaho (он же чайник), и любые указатели будут оценены.

я мог бы добавить, что это требование, чтобы ограничения внешнего ключа не были отключены. Поскольку я понимаю, что если что-то не так с ссылочной целостностью базы данных, MySQL не будет проверять ссылочную целостность, когда ограничения внешнего ключа снова включены. источник: 5.1.4. Системные Переменные Сервера -- foreign_key_checks

все подходы должны включать некоторые из проверки и стратегии отката, если вставка не удалась или не удалось поддерживать ссылочную целостность.

опять же, совершенно новый для этого, и делаю все возможное, чтобы предоставить как можно больше информации, если у вас есть какие-либо вопросы или запрос на разъяснение-просто дайте мне знать.

если вы можете опубликовать XML из файлов kjb и ktr (задания/преобразования), это будет супер. Может даже выследить каждый комментарий / ответ, который вы сделали в любом месте, и проголосовать за них... :-) ...для меня очень важно найти ответ на этот вопрос. этот.

спасибо!


ПРИМЕР ДАННЫХ: чтобы лучше разработать пример, предположим, что я пытаюсь загрузить файл, содержащий имя сотрудника, офисы, которые они занимали в прошлом, и их историю названия должности, разделенную вкладкой.

:
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

Примечание: база данных одной таблицы полностью нормализована (насколько может быть одна таблица) - и, например, в случае "John Smith" есть только один Джон Смит; то есть нет дубликатов, которые привели бы к конфликтам в ссылочной целостности.

на MyOffice схема базы данных содержит следующие таблицы:

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

так в этом случае. таблицы должны выглядеть так:

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

вот MySQL DDL для создания базы данных и таблиц:

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;



мои заметки в ответ на некоторые Ответ:

подготовка:

  1. (a) используйте примеры данных, создайте CSV, изменив <TAB> до запятой.
  2. (b) установите MySQL и создайте образец базы данных, используя образец DDL MySQL
  3. (c) установите чайник (он основан на Java и будет работать на всем, что запускает Java)
  4. (d) скачать KTR файл

поток данных шаг за шагом: (Мои Заметки)

  1. открыть KTR файл в чайнике, и дважды щелкните "CSV-файл ввода" и перейдите к CSV-файл, который вы создали. Разделитель уже должен быть установлен на запятую. Затем нажмите OK.
  2. дважды щелкните "вставить сотрудников" и выберите DB connector затем следуйте этим указаниям на создание нового подключения к базе данных

1 ответов


я собрал образец трансформация(щелкните правой кнопкой мыши и выберите Сохранить ссылку) на основе того, что вы предоставили. Единственный шаг, на котором я чувствую себя немного неуверенно, - это последние входные данные таблицы. Я в основном пишу данные соединения в таблицу и позволяю ей терпеть неудачу, если определенные отношения уже существуют.

Примечание:

это решение на самом деле не соответствует "все подходы должны включать некоторые из проверки и стратегии отката, если вставка терпит неудачу или терпит неудачу для поддержания ссылочной целостности.- критерии, хотя, вероятно, не подведут. Если вы действительно хотите настроить что-то сложное, мы можем, но это определенно должно заставить вас идти с этими преобразованиями.

alt text

поток данных шаг

1. мы начнем с чтения в вашем файле. В моем случае я преобразовал его в CSV, но вкладка тоже в порядке. alt text

2. теперь мы собираемся вставить имена сотрудников в Таблица сотрудников с помощью combination lookup/update. После вставки мы добавляем employee_id в наш поток данных как id и удалить EmployeeName из потока данных.

alt text

3. здесь мы просто используем шаг выбора значений, чтобы переименовать id поле для ид_сотрудника alt text

4. вставьте названия заданий так же, как мы сделали сотрудников и добавьте идентификатор заголовка в наш поток данных, также удалив JobLevelHistory от поток данных.

alt text

5. простое переименование идентификатора заголовка в title_id(см. Шаг 3) alt text

6. вставить офисы, получить id, удалить OfficeHistory из потока.

alt text

7. простое переименование идентификатора office в office_id (см. Шаг 3)

alt text

8. скопируйте данные с последнего шага в два потока со значениями employee_id,office_id и employee_id,title_id соответственно.

alt textalt text

9. используйте вставку таблицы для вставки данных соединения. Я выбрал его, чтобы игнорировать ошибки вставки, поскольку могут быть дубликаты, и ограничения PK заставят некоторые строки завершиться неудачей.

Таблицы Вывода

alt text

alt text

alt text

alt text

alt text