2016-04-26 1 views
0

Мне нужно использовать версию сообщества Kettle/PDI для чтения больших файлов данных с фиксированной длиной и сделать некоторые материалы ETL на них. Во время стадии разработки я столкнулся следующий вопрос:Pentaho Kettle - преобразовать шестнадцатеричный номер в поле типа двоичного кода

  • Kettle плагин «Input Fixed File» позволяет несколько типов данных с замечанием они на самом деле являются строками или массивы байтов.

  • Входящие мои данные содержали как строки, так и массивы байтов, соответствующие малым Endian представлениям long, int и short (специфическая эндемия Intel). Пример структуры записи для чтения: Column1 (char: 8), Column2 (long: 8 hex), Column3 (char: 2), Column4 (int: 4 hex).

Я попытался использовать плагин «Выбрать значения» и изменить двоичный тип столбца на Integer, но такой метод не реализован. Окончательный вариант I закончился следующим решением:

  • Я использовал «Пользовательский Java-класс» с кодом, вставленным ниже.

Как вы можете видеть, я использовал формулу, чтобы получить длительную ценность.

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException 
{  
    Object[] r = getRow(); 

    if (r == null) { 
     setOutputDone(); 
     return false; 
    } 

    // It is always safest to call createOutputRow() to ensure that your output row's Object[] is large 
    // enough to handle any new fields you are creating in this step. 
    r = createOutputRow(r, data.outputRowMeta.size());  

    // Get the value from an input field 
    byte[] buf; 
    long longValue; 

    // BAN_L - 8 bytes 
    buf= get(Fields.In, "BAN").getBinary(r);  
    longValue= ((buf[0] & 0xFFL) << 0) | ((buf[1] & 0xFFL) << 8) 
       | ((buf[2] & 0xFFL) << 16) | ((buf[3] & 0xFFL) << 24) 
       | ((buf[4] & 0xFFL) << 32) | ((buf[5] & 0xFFL) << 40) 
       | ((buf[6] & 0xFFL) << 48) | ((buf[7] & 0xFFL) << 56);  
    get(Fields.Out, "BAN_L").setValue(r, longValue); 

    //DEPOSIT_PAID_AMT -4 bytes 
    buf = get(Fields.In, "DEPOSIT_PAID_AMT").getBinary(r); 
    longValue= ((buf[0] & 0xFFL) << 0) | ((buf[1] & 0xFFL) << 8) 
       | ((buf[2] & 0xFFL) << 16) | ((buf[3] & 0xFFL) << 24); 
    get(Fields.Out, "DEPOSIT_PAID_AMT_L").setValue(r, longValue); 

    //BILL_SEQ_NO_L -2 bytes 
    buf = get(Fields.In, "BILL_SEQ_NO").getBinary(r); 
    longValue = ((buf[0] & 0xFFL) << 0) | ((buf[1] & 0xFFL) << 8); 
    get(Fields.Out, "BILL_SEQ_NO_L").setValue(r, longValue);  


    // Send the row on to the next step. 
    putRow(data.outputRowMeta, r); 

    //binaryToDecimal(); 

    return true; 
} 

Проблема возникает, когда у меня есть в одном файле данных 8-20 двоичных полей. Есть ли альтернатива этого подхода, так что я могу назвать что-то вроде:

getNumberFromLE(byte [] buff, buff.length);  

Есть ли какой-либо другой плагин в развитии, которые могут быть использованы для преобразования байт [], чтобы Pentaho котлового «Номер» типа данных? (BigNumber и Integer также хороши).

ответ

0

я нашел следующие возможности:

1) можно добавить дополнительные типы в класс ValueMetaInterface:

org.pentaho.di.core.row.ValueMetaInterface 

и добавить функции преобразования в

org.pentaho.di.core.row.ValueMeta 

2) добавить фрагмент кода реализация getNumberFromLE для фрагментов кода общего пользования «Пользовательский Java-класс»

3) добавлять новые, как плагин типов данных, как описано в сильфонных двух звеньев: Jira pluggable types GitHub pdi-valuemeta-map AddingDataTypes

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