Правильный способ переноса миллионов строк из исходной таблицы базы данных в целевую таблицу базы данных

Я столкнулся с той же проблемой, и у меня нет хорошего общего решения -

Сценарий такой:

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

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

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

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

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


person malsmith    schedule 20.02.2014    source источник
comment
Ну, это не совсем автомат, но PDI может выполнять разделы. В этой статье основное внимание уделяется разделению после того, как вы прочитаете данные. Если вы щелкните правой кнопкой мыши на шаге Table Input, будет доступен выбор разделения, но я не знаю, будет ли это работать на шаге ввода таблицы.   -  person Brian.D.Myers    schedule 20.02.2014
comment
Это интригует - но он имеет дело с данными после того, как они были преобразованы в строки - как вы говорите, в идеале мне нужен способ разбить шаг ввода таблицы, чтобы вытащить разделы исходной таблицы.   -  person malsmith    schedule 20.02.2014
comment
Будем надеяться, что @codek увидит этот пост.   -  person Brian.D.Myers    schedule 21.02.2014


Ответы (1)


Вы звонили?

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

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

where rownum % 2 = 0

в запросе вы будете извлекать каждую вторую строку.

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

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

Doco о переменных, которые будут использоваться в этой jira:

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

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

person Codek    schedule 21.02.2014
comment
Я вижу использование этого подхода для многопоточности шага ввода таблицы. - person malsmith; 21.02.2014
comment
Мой первоначальный вопрос заключался в попытке решить проблему, которую мы видели (особенно с MS SQL Server), когда мы чувствовали, что входные данные должны быть разделены на блоки определенного размера, чтобы соединение было закрыто, а затем снова открыто для следующего партия для обработки. Проблема заключалась в том, как заставить задание PDI выполнять что-то вроде цикла for / с шагом шага для циклического прохождения пакетов до тех пор, пока не будут обработаны записи count (*). - person malsmith; 21.02.2014
comment
В этом случае используйте параметр execute для каждой строки и передайте набор данных, который определяет минимальные / максимальные значения для каждого ствола, и используйте эти значения для предложения where. - person Codek; 25.02.2014