Использование чайника Пентахо, как я могу загрузить несколько таблиц из одной таблицы, сохраняя ссылочную целостность?
Вопрос
Нужно загружать данные из одного файла с 100 000+ записями в несколько таблиц на MySQL, поддерживающем отношения, определенные в файле / таблицах; Это означает, что отношения уже совпадают. Решение должно работать на последней версии MySQL и необходимо использовать двигатель InnoDB; MyISAM не поддерживает иностранные ключи.
Я совершенно новых для использования интеграции данных Pentaho (aka keptle), и любые указатели будут оценены.
Я мог бы добавить, что это требование о том, что ограничения внешних ключей не отключены. Поскольку я понимаю, что если что-то не так с референциальной целостностью базы данных, MySQL не проверяет ссылочную целостность, когда ограничения внешних ключей обратно включены. ИСТОЧНИК: 5.1.4. Переменные системы сервера - Enorth_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
Вот DDL MySQL для создания базы данных и таблиц:
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;
Мои заметки в ответ на выбранный ответ:
Prep:
- (а) Используйте данные образца, создайте CSV, изменяя
<TAB>
до запятой разграниченной. - (b) Установите MySQL и создайте образец базы данных с помощью образца DDL MySQL
- (c) Установите чайник (это Java на основе и будет работать на все, что работает Java)
- (d) скачать файл KTR
Dataflow за шагом: (Мои заметки)
- Откройте файл KTR в чайнике и дважды щелкнул «ввод файла CSV» и перейдите к создатому файлу CSV. Разделитель уже должен быть установлен на запятую. Затем нажмите «Хорошо».
- Дважды щелкните «Вставьте сотрудников» и выберите разъем DB, затем следуйте этим направлениям на Создание нового подключения к базе данных
Решение
Я собрал образец Преобразование (щелкните правой кнопкой мыши и выберите «Сохранить ссылку) основываясь на том, что вы предоставили. Единственный шаг, на котором я чувствую себя немного неопределенным, это последние входы таблицы. Я в основном пишу данные присоединения к столу и позволить ему не удавать, если определенные отношения уже существуют.
примечание:
Это решение на самом деле не соответствует действительности «Все подходы должны включать некоторые из валидации, а стратегия отката должна предотвратить неудачу вставки или не поддерживать ссылочную целостность». Критерии, хотя это, вероятно, не потерпят неудачу. Если вы действительно хотите настроить что-то сложное, что мы можем, но это, безусловно, должно выходить с этими преобразованиями.
Dataflow за шагом
1. Начнем с чтения в вашем файле. В моем случае я преобразовал его в CSV, но вкладка тоже встроена.
2. Теперь мы собираемся вставить имена сотрудников в таблицу сотрудников, используя combination lookup/update
. Отказ После вставки мы добавим Workeee_id в наш DataStream как id
и удалить EmployeeName
из потока данных.
3. Здесь мы просто используем шаг выбора значений для переименования id
поле для сотруднизу_id.
4. Вставьте заголовки заданий, как мы выполнили сотрудников и добавив идентификатор заголовка в наш DataStream также удалять JobLevelHistory
от DataStream.
5. Простое переименование идентификатора заголовка в title_id (см. Шаг 3)
6. Вставьте офисы, получите идентификатор, удалите офигуристорию из потока.
7. Простое переименование идентификатора офиса в Office_id (см. Шаг 3)
8. Скопируйте данные с последнего шага на два потока со значениями employee_id,office_id
и employee_id,title_id
соответственно.
9. Используйте вставку таблицы, чтобы вставить данные присоединения. Я получил его выбрал, чтобы игнорировать ошибки вставки, так как могут быть дубликаты, а ограничения PK сделают несколько строк.