Чайник: заполнение поля последовательностью без конфликта - PullRequest
5 голосов
/ 16 ноября 2011

У меня есть поток данных со следующей структурой

user_id (integer)
user_name (string)

Значение user_id находится между 100 и 65536. Я хочу добавить поле target_user_id (целое число) в соответствии со следующей логикой:

  • Если user_id находится в диапазоне 1000..9999, то пусть поле target_user_id будет равно user_id
  • Если нет, то заполните target_user_id чем-то в диапазоне 1000..9999, не вызывая конфликта. Желательно наименьшее возможное.

Длина потока не превышает 9000. Поле user_id является уникальным в исходном потоке.

1 Ответ

3 голосов
/ 25 ноября 2011

Я не уверен, какую среду Kettle вы используете, но общая процедура может быть следующей:

  1. Создать временную таблицу базы данных (возможно, таблицу базы данных в памяти)
  2. Инициализируйте его с записями с user_id 1000..9999 и user_name = null (используйте TableOutput)
  3. Открыть входной поток и обработать записи с помощью user_id 1000..9999, обновив соответствующую запись базы данных с помощью user_name. (используйте Обновить) Игнорировать все другие записи.
  4. Закрыть и снова открыть поток ввода
  5. Обрабатывать каждую запись входного потока с идентификатором пользователя не в 1000..9999 с помощью:

    • получить самый низкий неиспользуемый user_id, выполнив запрос SQL (DBLookup)

      SELECT MIN(user_id) FROM temporary_table WHERE user_name IS NULL;
      
    • Обновить эту запись с текущим именем пользователя (используйте Обновить)

  6. Чтение каждой записи во временной таблице базы данных с ненулевым именем пользователя (используйте TableInput) и запись в выходной поток
  7. Удалить временную таблицу базы данных

Надеюсь, это поможет

...