Новичок в Nifi и ищет возможность конвертировать результаты SQL в JSON в запрошенном формате.
Результат SQL:
Стандартный результат выглядит следующим образом при использовании процесса ConvertRecord или ConvertAvroToJSON:
[
{
"FIELD2": "24017",
"MEMBER_ID": "874450963",
"PARTNUM": "015935966",
"PRICE": "42",
"QUANTITY": "1",
"TIMEPLACED": null,
"TOTALPRODUCT": "173.95",
"TOTALSHIPPING": "0",
"TOTALTAX": "0"
},
{
"FIELD2": "24017",
"MEMBER_ID": "874450963",
"PARTNUM": "000756009",
"PRICE": "32",
"QUANTITY": "1",
"TIMEPLACED": null,
"TOTALPRODUCT": "173.95",
"TOTALSHIPPING": "0",
"TOTALTAX": "0"
},
{
"FIELD2": "24017",
"MEMBER_ID": "874450963",
"PARTNUM": "012179293",
"PRICE": "99.95",
"QUANTITY": "1",
"TIMEPLACED": null,
"TOTALPRODUCT": "173.95",
"TOTALSHIPPING": "0",
"TOTALTAX": "0"
}
]
Запрос состоит в том, чтобы сгруппировать их и получить часть, цену и количество в виде массива, подобного этому:
[
{
"FIELD2": "24017",
"MEMBER_ID": "874450963",
"TIMEPLACED": null,
"TOTALPRODUCT": "173.95",
"TOTALSHIPPING": "0",
"TOTALTAX": "0",
"itemDetails": [
{
"PARTNUM": "015935966",
"PRICE": "42",
"QUANTITY": "1"
},
{
"PARTNUM": "000756009",
"PRICE": "32",
"QUANTITY": "1"
},
{
"PARTNUM": "012179293",
"PRICE": "99.95",
"QUANTITY": "1"
}
]
}
]
как нам это сделать?
Спасибо!
Поискал по форуму, ничего похожего не нашел.
Новый сценарий:
[
{
"FIELD2": "24017",
"MEMBER_ID": "874450963",
"PARTNUM": "015935966",
"PRICE": "42",
"QUANTITY": "1",
"TIMEPLACED": null,
"TOTALPRODUCT": "173.95",
"TOTALSHIPPING": "0",
"TOTALTAX": "0"
},
{
"FIELD2": "24017",
"MEMBER_ID": "874450963",
"PARTNUM": "000756009",
"PRICE": "32",
"QUANTITY": "1",
"TIMEPLACED": null,
"TOTALPRODUCT": "173.95",
"TOTALSHIPPING": "0",
"TOTALTAX": "0"
},
{
"FIELD2": "24017",
"MEMBER_ID": "874450963",
"PARTNUM": "012179293",
"PRICE": "99.95",
"QUANTITY": "1",
"TIMEPLACED": null,
"TOTALPRODUCT": "173.95",
"TOTALSHIPPING": "0",
"TOTALTAX": "0"
},
{
"FIELD2": "25008",
"MEMBER_ID": "874221898",
"PARTNUM": "013519828",
"PRICE": "16.95",
"QUANTITY": "1",
"TIMEPLACED": null,
"TOTALPRODUCT": "83.80",
"TOTALSHIPPING": "0",
"TOTALTAX": "0"
},
{
"FIELD2": "25008",
"MEMBER_ID": "874221898",
"PARTNUM": "012625445",
"PRICE": "5.95",
"QUANTITY": "1",
"TIMEPLACED": null,
"TOTALPRODUCT": "83.80",
"TOTALSHIPPING": "0",
"TOTALTAX": "0"
},
{
"FIELD2": "25008",
"MEMBER_ID": "874221898",
"PARTNUM": "017219152",
"PRICE": "54.95",
"QUANTITY": "1",
"TIMEPLACED": null,
"TOTALPRODUCT": "83.80",
"TOTALSHIPPING": "0",
"TOTALTAX": "0"
}
]
Результат должен быть:
[
{
"FIELD2": "24017",
"MEMBER_ID": "874450963",
"TIMEPLACED": null,
"TOTALPRODUCT": "173.95",
"TOTALSHIPPING": "0",
"TOTALTAX": "0",
"itemDetails": [
{
"PARTNUM": "015935966",
"PRICE": "42",
"QUANTITY": "1"
},
{
"PARTNUM": "000756009",
"PRICE": "32",
"QUANTITY": "1"
},
{
"PARTNUM": "012179293",
"PRICE": "99.95",
"QUANTITY": "1"
}
]
},
{
"FIELD2": "25008",
"MEMBER_ID": "874221898",
"TIMEPLACED": null,
"TOTALPRODUCT": "183.80",
"TOTALSHIPPING": "0",
"TOTALTAX": "0",
"itemDetails": [
{
"PARTNUM": "013519828",
"PRICE": "16.95",
"QUANTITY": "1"
},
{
"PARTNUM": "012625445",
"PRICE": "5.95",
"QUANTITY": "1"
},
{
"PARTNUM": "017219152",
"PRICE": "54.95",
"QUANTITY": "1"
}
]
}
]
Одним из вариантов может быть выполнение этого преобразования с использованием процесса JoltTransformJSON со следующей спецификацией:
[
{
"operation": "shift",
"spec": {
"*": {
"*": "&", // form arrays for the attibutes with keys other than below ones
"PARTNUM|PRICE|QUANTITY": "itemDetails[&1].&"
}
}
},
{
"operation": "cardinality",
"spec": {
"*": "ONE", // pick only one of the repeating components
"itemDetails": "MANY"
}
},
{
"operation": "sort"
}
]
Изменить. Вы можете обработать новый случай, определив атрибут как идентификатор ключа, например FIELD2
или MEMBER_ID
(я выбрал FIELD2
), например
[
{
"operation": "shift",
"spec": {
"*": {
"*": "@1,FIELD2.&",
"PARTNUM|PRICE|QUANTITY": "@1,FIELD2.itemDetails[&1].&"
}
}
},
{ // get rid of object keys
"operation": "shift",
"spec": {
"*": ""
}
},
{
"operation": "cardinality",
"spec": {
"*": {
"*": "ONE", // pick only one of the repeating components
"itemDetails": "MANY"
}
}
},
{ // just to order the attributes
"operation": "sort"
},
{// get rid of redundantly generated null values
"operation": "modify-overwrite-beta",
"spec": {
"*": "=recursivelySquashNulls"
}
}
]
У меня вопрос вдогонку. Это работает для исходного тестового сценария. Теперь я извлекаю больше данных из базы данных, и они не группируются так, как должны. Как сгруппировать для каждого FIELD2, MEMBER_ID, TIMEPLACED, TOTALPRODUCT, TOTALSHIPPING, TOTALTAX?
да, позвольте мне сделать это.
Я обновил исходный вопрос новым сценарием. Не удалось добавить его в раздел комментариев.
Я только что добавил новый случай @Albert
Спасибо! Это работает. Мне нужно будет больше прочитать о JoltTransformJSON.