Используя Pentaho Kettle, как мне загрузить несколько таблиц из одной таблицы при сохранении ссылочной целостности? - PullRequest
21 голосов
/ 14 ноября 2010

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

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

Могу добавить, что это требование, чтобы ограничения внешнего ключа НЕ были отключены. Поскольку я понимаю, что если что-то не так с ссылочной целостностью базы данных, 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

ПРИМЕЧАНИЕ: База данных с одной таблицей полностью нормализована (насколько может быть одна таблица) - и, например, в случае с «Джоном Смитом» есть только один Джон Смит; Это означает, что нет дубликатов, которые могли бы привести к конфликтам в ссылочной целостности.

Схема базы данных 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 и создайте пример базы данных, используя образец MySQL DDL
  3. (c) Установите Kettle (он основан на Java и будет работать на всем, что работает на Java)
  4. (d) Загрузить файл KTR

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

  1. Откройте файл KTR в Kettle, дважды щелкните «Ввод CSV-файла» и найдите созданный вами CSV-файл. Разделитель уже должен быть установлен на запятую. Затем нажмите OKAY.
  2. Дважды щелкните «Вставить сотрудников» и выберите соединитель БД, затем следуйте этим инструкциям на Создание нового соединения с БД

1 Ответ

33 голосов
/ 14 ноября 2010

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

примечание:

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

alt text

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

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

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

alt text

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

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

alt text

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

6. Вставка офисов, получение идентификаторов, удаление OfficeHistory из потока.

alt text

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

alt text

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

alt text alt text

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

Выходные таблицы

alt text

alt text

alt text

alt text

alt text

...