在Jolt中如何修改输出json的键并从输入中复制值

时间:2019-05-30 05:42:54

标签: apache-nifi jolt

在Nifi中,我想将所有输入值复制到具有与输入相比已修改的键的输出。

输入:

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

输出:

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

在这里,我想将名字大写,并将薪水四舍五入到小数点后两位。

2 个答案:

答案 0 :(得分:2)

您可以使用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 :(得分:1)

根据this,JOLT中还没有一个纯四舍五入函数。但是,这里有一个mongoimport --d qtrav --c reserv --type csv --columnHaveTypes --fields "reservation_id.string(),city.string(),starts_at.string(),ends_at.string()" --file /Downloads/offline_reservations.csv 函数,请尝试以下规范(它在online tester中对您有用,对您有用):

divideAndRound

链的第一部分只是将数字除以1,然后四舍五入到第二位,链规范的第二部分只是将您的[ { "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" } } } ] 字段变回字符串;当您使用salary时,它将变成一个数字字段。如果您希望使用数字字段,则可以忽略链中的第二个规范。