В Nifi я хочу скопировать все входные значения на выход, который имеет измененные ключи по сравнению с вводом.
Вход:
{
"test": {
"name":"John",
"salary":"2500.145263"
}
}
Выход:
{
"company": {
"fn":"JOHN",
"sl":"2500.14"
}
}
Здесь я хочу сделать имя заглавным, а зарплату округлить до двух знаков после запятой.
Вы можете использовать процессор 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)
}
}
Согласно это, в 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
, он превратит его в числовое поле. Если вы предпочитаете числовое поле, вы можете пропустить вторую спецификацию в цепочке.
Спасибо !!, я знаю, как это сделать в сценарии выполнения, но я хочу в Jolt Transform