Pentaho PDI: окончательное значение вычисляемого поля предыдущего ряда

Я попытался использовать шаг запроса Analytik для доступа к некоторому вычисляемому полю предыдущей строки. Оказывается, что все строки вычисляются параллельно, и что доступ к полям предыдущей строки дает вам текущее значение, которое они имеют во время их обработки, что является своего рода случайным. Похоже, невозможно получить окончательное значение поля предыдущего ряда. Или есть другой способ, кроме шага Analytik Query? Я думаю, все, что мне нужно, это флажок "Ожидание завершения предыдущих строк" ​​...

Для чего мне это нужно: я обрабатываю зависящие от времени данные и делаю распознавание состояния. Когда я в настоящее время нахожусь в состоянии A, я делаю другие вещи со своими данными, тогда как я нахожусь в состоянии B. Поэтому мне нужно знать состояние предыдущей строки данных (которая определяется не до конца моего преобразования).

Это можно сделать в Excel очень просто, так что, думаю, в PDI должен быть какой-то путь.:-)

Спасибо за любую помощь!

3 ответа

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

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

Используйте преобразования "Определить последнюю строку в потоке" и "Фильтровать строки". 1-е преобразование проверяет, является ли его последняя строка, и возвращает логическое значение, а последнее можно использовать для фильтрации записей на основе возвращенного логического значения.

Я считаю, что это может быть решено с помощью шага User Defined Java Class (UDJC). Если вы сортируете строки перед их обработкой, шаг Сортировка по будет ожидать последней строки, установленной по умолчанию.

Вот самый простой пример написания выходной строки для каждой входной строки. Важным моментом, о котором следует помнить при выполнении шага User Defined Java Class, является тот факт, что они переписывают весь ваш набор данных, поэтому о них нужно хорошо подумать, особенно если вы просматриваете предыдущие строки. Надеюсь, это немного поможет.

// A class member that stores the previous row:
public Object[] previousRow;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) 
    throws KettleException  {   

    // Fetching row:
    Object[] r = getRow();
    // Check if r is null:
    if (r == null) {
      setOutputDone();
      return false;
    }
    // Get some field's value:
    String someFieldValue = get(Fields.In, "someFieldName").getString(r);

    // Log value if you want:
    logBasic("current field value is " + someFieldValue);

    // Generate an output row object:
    Object[] outputRow = RowDataUtil.createResizedCopy(r, data.outputRowMeta.size());

    // Modify row's field values if needed:
    get(Fields.Out, "someFieldName").setValue(outputRow, "a modified value here");

    // Write row:
    putRow(data.outputRowMeta, outputRow);
    // Assign current row to previous row:
    previousRow = r;
    return true;
}

РЕДАКТИРОВАТЬ: Еще одна важная вещь, которую нужно отметить в отношении PDI - метод блокировки, либо путем блокирования шагов, либо путем сортировки по шагам, выполняется путем проверки наборов строк, а не отдельных строк. Как это можно проверить?

Щелкните правой кнопкой мыши -> Настройки преобразования -> Разное -> Количество строк в наборе строк.

Значение по умолчанию составляет 10000 строк. Разработчики PDI часто создают тупик, используя один из шагов блокировки с размером набора строк, который не соответствует их объему данных - имейте это в виду.

Другие вопросы по тегам