2014-02-20 3 views
1

Я бежал с той же проблемой и не имеют хорошее общее решение -Правильный способ передать миллионы строк из таблицы исходной базы данных в таблице базы данных назначения

Сценарий:

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

Проблема в том, что запуск одного потока для чтения всех X миллионов строк в одном select/connection всегда сталкивается с проблемами. Поэтому я хотел бы, чтобы Pentaho позволил мне сказать сделать несколько выборок и обработать строки 100K или 500K на «пакет» и продолжать обрабатывать, пока не будет больше строк.

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

В идеале я хотел бы, чтобы Pentaho установил «количество копий» и размер партии на шаге ввода таблицы, чтобы он был автоматическим!

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

+0

Ну, это не совсем автоматизировано, но PDI может выполнять [разделение] (http://wiki.pentaho.com/display/EAI/Partitioning+data+with+PDI). Эта статья посвящена разделению после того, как вы прочитали данные. Если вы щелкните правой кнопкой мыши на шаге «Вход в таблицу», выбор разделов доступен, но я не знаю, будет ли это работать на шаге ввода таблицы. –

+0

Это интригует - но это касается данных после того, как они были превращены в строки - как вы говорите, в идеале я хочу, чтобы разделить шаг ввода таблицы, чтобы вытащить разделы исходной таблицы. – malsmith

+0

Будем надеяться, что @codek увидит это сообщение. –

ответ

1

А, вы позвонили?

Да; способ сделать это - действительно использовать несколько копий, а затем использовать «число» шага и функцию мод.

So; если у вас есть 2 копии шага, если вы скажете:

where rownum % 2 = 0 

В запросе вы вытащите каждый второй ряд.

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

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

Doco на переменные для использования в этом JIRA:

http://jira.pentaho.com/browse/PDI-3253

Его тогда ваш выбор, если вы хотите сохранить «раздел» течет вниз по течению.

+0

Я могу видеть, используя этот подход, чтобы иметь возможность многопоточности на этапе ввода таблицы. – malsmith

+0

Мой первоначальный вопрос заключался в том, чтобы решить проблему, которую мы видели (особенно с MS SQL Server), где мы чувствовали, что входные данные должны быть собраны в узлы определенного размера - чтобы соединение было закрыто, а затем повторно открылось для следующий пакет для обработки. Проблема заключалась в том, как сделать работу PDI чем-то вроде цикла for/loop с шагом шага, чтобы циклически выполнять партии до обработки записей count (*). – malsmith

+0

В этом случае используйте параметр «выполнить для каждой строки» и передайте в набор данных, который определяет значения min/max для каждой соединительной линии, и используйте эти значения для предложения where. – Codek

Смежные вопросы