在Nifi中,我想将所有输入值复制到具有与输入相比已修改的键的输出。
输入:
{
"test": {
"name":"John",
"salary":"2500.145263"
}
}
输出:
{
"company": {
"fn":"JOHN",
"sl":"2500.14"
}
}
在这里,我想将名字大写,并将薪水四舍五入到小数点后两位。
答案 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
时,它将变成一个数字字段。如果您希望使用数字字段,则可以忽略链中的第二个规范。