我正在尝试使用UpdateRecord Processor解析Nifi(1.7.1)中的某些数据。 原始数据是json文件,我想基于模式将其转换为Avro。 Avro转换是可以的,但是在这种转换中,我还需要将json数据中的一个数组元素解析为Avro中的另一种结构。 这是输入json的样本数据:
{ "geometry" : {
"coordinates" : [ [ 4.963087975800593, 45.76365595859971 ], [ 4.962874487781098, 45.76320922779652 ], [ 4.962815443439148, 45.763116079159374 ], [ 4.962744732112515, 45.763010484202866 ], [ 4.962096825239138, 45.762112721939246 ] ]} ...}
成为其架构(在RecordReader中指定):
{ "type": "record",
"name": "features",
"fields": [
{
"name": "geometry",
"type": {
"type": "record",
"name": "geometry",
"fields": [
{
"name": "coordinatesJson",
"type": {
"type": "array",
"items": {
"type": "array",
"items": "double"
}
}
},
]
}
},
....
]
}
如您所见,坐标是一个数组数组。
我需要基于以下架构(在RecordWriter中指定)将这些数据解析为Avro:
{
"name": "outputdata",
"type": "record",
"fields": [
{"name": "coordinatesAvro",
"type": {
"type": "array",
"items" : {
"type" : "record",
"name" : "coordinatesAvro",
"fields" : [ {
"name" : "X",
"type" : "double"
}, {
"name" : "Y",
"type" : "double"
} ]
}
}
},
.....
]
}
这里的问题是,我无法使用RecordPath函数从坐标Json解析为坐标Avro 我尝试了几种映射,例如:
Property: Value:
/coordinatesJson[0..-1]/X /geometry/coordinatesAvro[*][0]
/coordinatesJson[0..-1]/Y /geometry/coordinatesAvro[*][1]
这应该是一个相当直观的解析步骤,但是正如我所说,我已经兜圈子了一段时间。
任何帮助将不胜感激。
答案 0 :(得分:0)
当我遇到类似的问题时,我接下来要做的是: 1)通过ExecuteScript Processor将我需要的结构从Json转换为Json(例如,在您的情况下:坐标Avro)。我使用ECMAScript是因为您可以简单地解析JSON并使用对象(对其进行转换)。 2)具有用于读取器和写入器的一个通用模式(在您的情况下为coordinatesAvro)的ConvertJsonToAvro。 它的效果非常好,我已经在BigData案例中使用了它。这是解决您问题的可能方法之一。