Я использую процессор JOLTTransformJson в Nifi
.
Мой ввод:
[
{
"col_name": "time",
"data_type": "timestamp",
"is_nullable": true
},
{
"col_name": "otherData",
"data_type": "string",
"is_nullable": false
}
]
Я использую следующую спецификацию:
[
{
"operation": "shift",
"spec": {
"*": {
"col_name": "name",
"data_type": "type[0]",
"is_nullable": {
"true": "type[1]",
"false": "type[1]"
}
}
}
},
{
"operation": "default",
"spec": {
"*": {
"type[1]": "notnull"
}
}
}
]
Ожидаемый результат:
{
"type": "record",
"name": "table_name",
"fields": [
{
"name": "time",
"type": [
"timestamp",
"null"
]
},
{
"name": "otherData",
"type": [
"string",
"notnull"
]
}
]
}
Но получить приведенный ниже результат в качестве текущего результата, объединив все значения в массиве, например:
{
"name": [
"time",
"otherData"
],
"type": [
[
"timestamp",
"int"
],
null
]
}
Может кто-нибудь, пожалуйста, помогите, что мне не хватает.
Вы можете использовать следующую спецификацию преобразования первого сдвига при обходе объектов массива, чтобы иметь возможность многократно применять методы:
[
{
"operation": "shift",
"spec": {
"#record": "type", // fixed values formed by using # wildcards left-hand-side
"#table_name": "name",
"*": {
"col_*": "fields[#2].&(0,1)", // replicate the 1st replacement of the asterisk from the current(0th) level
"is_nullable": { // conditional logic starts here
"@(1,data_type)": "fields[#3].type",
"true": {
"#null": "fields[#4].type"
},
"false": {
"#notnull": "fields[#4].type"
}
}
}
}
},
{ //to sort the attributes within the fields array
"operation": "sort",
"spec": {
"fields": ""
}
},
{ //to sort whole result
"operation": "shift",
"spec": {
"type": "&",
"name": "&",
"fields": "&"
}
}
]
второе и третье преобразование просто добавляются для сортировки атрибутов/массивов по желанию
это дает мне все упорядоченные, как и ожидалось, за исключением полей «тип»: [«null», «timestamp»] , которые должны быть «type»: [«timestamp», «null»]
спасибо, это сработало, теперь я проверяю, может ли процессор NiFi JoltTransformJson принимать динамические значения, мне нужно передать значения для «#table_name»
да, это дает результаты в отдельных полях, за исключением упорядочения в полях, мне нужно «имя» перед «типом» и в массиве «тип», сначала тип данных поля (метка времени/строка), затем нуль/не нуль