Пентахо: как автоматически читать имена столбцов и сохранять их в переменных?

Я новичок в Пентахо и мне нужна помощь.

Я получаю данные из таблицы базы данных, а затем мне нужно подсчитать количество столбцов этих таблиц и сохранить их имена в переменных. Кто-нибудь знает, как это сделать? Или как читать имена столбцов на шаге Java Script? Спасибо за помощь.


person Jane    schedule 13.10.2016    source источник
comment
Поскольку вы заранее не знаете количество столбцов, сохранение имен в переменных - странный, но не невозможный вариант. почему ты хочешь сделать это? Как вы планируете назвать переменные?   -  person matthiash    schedule 13.10.2016


Ответы (1)


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

Вариант 1 (структура метаданных шага потока):

Один из вариантов - использовать структуру метаданных шага потока http://wiki.pentaho.com/display/EAI/Metadata+Structure+of+Stream На этом шаге появятся следующие поля:

  • Позиция: позиция поля во входящем потоке данных.
  • Имя поля: имя поля во входящем потоке данных.
  • Комментарии: без комментариев
  • Тип: строка, целое число, число и т. Д.
  • Длина: длина поля.
  • Точность: применимо для целых чисел, чисел и -1, если не применимо (например, для строк)
  • Происхождение: шаг, на котором были получены метаданные.

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

Вариант 2 (Javascript):

Шаг Java Script имеет getInputRowMeta () функция, которая возвращает RowMetaInterface.

Далее вы можете вызвать getValueMetaList (), который вернет вам список ValueMetaInterface. Затем вы можете просто перебрать все элементы в списке и вызвать getName() для каждого объекта, чтобы получить имя каждого поля ввода.

Пример (большая часть кода здесь на самом деле просто для иллюстрации вывода):

// get instance of RowMetaInterface, which represents metadata of your input row:
var rowMetaInterface = getInputRowMeta();
// get List of ValueMetaInterface objects, which represent each of your input fields:
var valueMetaList = rowMetaInterface.getValueMetaList();
// get this object to be able to iterate over the list:
var iterator = valueMetaList.iterator();

// I am going to save all results into this JS object, then convert it to JSON string and pass into a variable
var allFields = [];
while (iterator.hasNext()) {
    // get current ValueMetaInterface object:
    var valueMetaInterface = iterator.next();
    // The name of current field:
    var fieldName = valueMetaInterface.getName();
    // getType() returns just an internal integer number of the type:
    var typeIndex = valueMetaInterface.getType();
    // typeName will hold the actual String name of the type:
    var typeName = org.pentaho.di.core.row.ValueMetaInterface.typeCodes[typeIndex];

    // You proabably don't need the following part. It is here just for illustration purpose:
    // Prepare data to be converted to JSON:
    var field = {};
    // wrap Java String into a JavaScript String object to be able to convert them into Json
    field.fieldName = String(fieldName);
    field.fieldType = String(typeName);
    allFields.push(field)
}

var allFieldsJson = JSON.stringify(allFields);
/*  scope of the variable:
    "s": System scope
    "r": root
    "p": parent
    "g": grandparent*/
var variableScope = "r";
setVariable("inputFields", allFieldsJson, variableScope);
writeToLog("b", "JSON string:");
writeToLog("b", allFieldsJson);

// In other job/transformation you'll be able to parse json object into a javascript object back:
var fields = JSON.parse(allFieldsJson);
for (var i = 0; i < fields.length; i++) {
    fieldName = fields[i].fieldName;
    fieldType = fields[i].fieldType;
    writeToLog("b", "Field number " + i + ":");
    writeToLog("b", fieldName);
    writeToLog("b", fieldType);
}

В журнале вы увидите следующий вывод:

2016/10/13 15:33:09 - Modified Java Script Value.0 - Optimization level set to 9.
2016/10/13 15:33:09 - Modified Java Script Value.0 - JSON string:
2016/10/13 15:33:09 - Modified Java Script Value.0 - [{"fieldName":"test","fieldType":"String"},{"fieldName":"test 2","fieldType":"Integer"},{"fieldName":"another field","fieldType":"BigNumber"}]
2016/10/13 15:33:09 - Modified Java Script Value.0 - Field number 0:
2016/10/13 15:33:09 - Modified Java Script Value.0 - test
2016/10/13 15:33:09 - Modified Java Script Value.0 - String
2016/10/13 15:33:09 - Modified Java Script Value.0 - Field number 1:
2016/10/13 15:33:09 - Modified Java Script Value.0 - test 2
2016/10/13 15:33:09 - Modified Java Script Value.0 - Integer
2016/10/13 15:33:09 - Modified Java Script Value.0 - Field number 2:
2016/10/13 15:33:09 - Modified Java Script Value.0 - another field
2016/10/13 15:33:09 - Modified Java Script Value.0 - BigNumber
2016/10/13 15:33:09 - Modified Java Script Value.0 - Finished processing (I=0, O=0, R=1, W=1, U=0, E=0)
person Andrei Luksha    schedule 13.10.2016