В Jolt как изменить ключи out положить JSON и скопировать значения из ввода - PullRequest
0 голосов
/ 30 мая 2019

В Nifi я хочу скопировать все входные значения для вывода, который изменил ключи по сравнению с вводом.

Введите:

{
    "test": {
    "name":"John",
    "salary":"2500.145263" 
    }
}

Выход:

{
    "company": {
    "fn":"JOHN",
    "sl":"2500.14" 
    }
}

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

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Вы можете использовать процессор ExecuteScript, чтобы сделать преобразования и написать свой собственный фрагмент кода.

Я использовал для этого скрипт ECMA, но есть и другие варианты.

    var StreamCallback = Java.type("org.apache.nifi.processor.io.StreamCallback");
    var IOUtils = Java.type("org.apache.commons.io.IOUtils");
    var StandardCharsets = Java.type("java.nio.charset.StandardCharsets");
    var flowFile = session.get();
    var obj = {};
    var strname = ""
    var strupper = ""
    var queryjson = {};
var sal 


if (flowFile != null) {
    // Create a new StreamCallback, passing in a function to define the interface method
    try {
        flowFile = session.write(flowFile,
            new StreamCallback(
                function (inputStream, outputStream) {
                    var text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)

                    obj = JSON.parse(text)

                    obj.company = obj.test

                     strname = obj.test.name
                    strupper = strname.toUpperCase()
                    obj.company.fn = strupper

                    sal = parseFloat(obj.test.salary).toFixed(2)
                    obj.company.sl = sal

                    delete obj.test.name
                    delete obj.test.salary
                    delete obj.test



                    outputStream.write(JSON.stringify(obj).getBytes(StandardCharsets.UTF_8))
                }
            )
        );

        session.transfer(flowFile, REL_SUCCESS)
    }
    catch (e) {
        flowFile = session.putAttribute(flowFile, 'error', e);
        session.transfer(flowFile, REL_FAILURE)
    }
}
1 голос
/ 31 мая 2019

Согласно это , в JOLT (пока) нет функции чистого округления.Однако есть функция divideAndRound, попробуйте следующую спецификацию (она работала для меня в онлайн-тестере с вашим вводом):

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "test": {
        "salary": "=divideAndRound(2,@(1,salary),1)"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "test": {
        "salary": "=toString(@(1,salary))"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "test": {
        "name": "company.fn",
        "salary": "company.salary"
      }
    }
    }
]

Первая часть цепочки просто делитсячисло на 1, а затем округление до 2 мест, вторая часть спецификации цепочки просто для того, чтобы превратить ваше поле salary обратно в строку;когда вы используете divideAndRound, оно превратится в числовое поле.Если вы предпочитаете числовое поле, вы можете опустить вторую спецификацию в цепочке.

...