Чтение данных в таблицу ввода pentaho - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть вопросы. Может быть, кто-то поможет мне. У меня есть преобразование, как показано ниже enter image description here

В Table_input я читаю данные из базы данных MS SQL. В Table_input_2 я читаю данные из базы данных DB2. В объединении слиянием я сравниваю ID друг с другом и с остальными атрибутами в таблицах. В строках фильтра я нахожу записи, по которым одинаковый идентификатор является разницей. Сейчас я пишу разницу в файле xlsx. В Table_input и Table_input2 есть много записей - более 100 млн. Часто различия обусловлены временем выполнения запросов в базах данных MS SQL и DB2. Я бы хотел, чтобы этот процесс был проведен снова, когда вернулись разногласия. Я хотел бы быть уверен, что различия возникли с момента завершения запроса. Кто-нибудь может дать мне подсказку, как это сделать?

1 Ответ

1 голос
/ 17 апреля 2020

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

Если вы хотите найти постоянные различия, Ваши варианты зависят от обстоятельств ваших операционных систем.

Если вам повезет, у вас есть (или вы можете получить) версия строки из таблиц MS SQL. Они обновляются при изменении строки. Если репликация в DB2 включает их, вы точно знаете, сравниваете ли вы одну и ту же версию строки.

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

В вашей ситуации я буду обрабатывать «маленькие» наборы строк по 10k, 100k или 1M за раз в преобразовании и использовать родительское задание для увеличения Стартовый ID каждый раз. Это сокращает время запросов и, надеюсь, различия.

Полный пример вы можете увидеть в одном из моих предыдущих ответов здесь . Это немного отличается, потому что это было для смещения / предела с неизвестными итоговыми записями.

Идея состоит в том, что ваше преобразование принимает параметры в качестве входных данных, указывающих, с какого идентификатора начинать и сколько строк брать. Затем он обрабатывает их и сообщает количество обработанных записей. Если последний запрос получил около 0 записей назад, все готово. Из-за изменений в реальном времени он может не достигать 0 точно.

Родительское задание проверяет, завершено ли, а если нет, обновляет новый START_ID и снова выполняет преобразование.

Ваши входные данные из таблицы будут измените это для DB2:

SELECT ...
FROM TABLE
WHERE ID >= ${START_ID} 
ORDER BY ID
LIMIT ${BATCH_SIZE}

и MS SQL (это было давно, может быть не правильно):

SELECT TOP ${BATCH_SIZE} ...
FROM TABLE
WHERE ID >= ${START_ID}
ORDER BY ID

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

Шаг Merge (diff) делает то же, что и в строках Merge Join и Filter, но требует идентичной компоновки полей. Может быть вариант.

Наконец, я бы добавил Get System Info для метки времени, а затем сохранил любые измененные идентификаторы в таблице с меткой времени, которую вы их обнаружили. Затем сообщайте только о различиях, которые сохраняются более X минут / часов / пробегов.

...