Arrays 使用ApacheNIFI将Json数组转换为csv
我希望将带有数组的JSON转换为csv格式。数组中每行的元素数是动态的。我尝试使用这个流(在文章中附上了流文件xml) GetFile-->ConvertRecord-->UpdateAttribute-->PutFile 还有其他选择吗 JSON格式:Arrays 使用ApacheNIFI将Json数组转换为csv,arrays,json,apache-nifi,jsonpath,Arrays,Json,Apache Nifi,Jsonpath,我希望将带有数组的JSON转换为csv格式。数组中每行的元素数是动态的。我尝试使用这个流(在文章中附上了流文件xml) GetFile-->ConvertRecord-->UpdateAttribute-->PutFile 还有其他选择吗 JSON格式: { "LogData": { "Location": "APAC", "product": "w1" }, "Outcome": [ { "limit": "0", "pri": "3", "result": "pass" }
{ "LogData": {
"Location": "APAC",
"product": "w1" }, "Outcome": [
{
"limit": "0",
"pri": "3",
"result": "pass"
},
{
"limit": "1",
"pri": "2",
"result": "pass"
},
{
"limit": "5",
"priority": "1",
"result": "fail"
} ], "attr": {
"vers": "1",
"datetime": "2018-01-10 00:36:00" }}
以csv为单位的预期输出:
location, product, limit, pri, result, vers, datetime
APAC w1 0 3 pass 1 2018-01-10 00:36:00
APAC w1 1 2 pass 1 2018-01-10 00:36:00
APAC w1 5 1 fail 1 2018-01-10 00:36:00
附加流的输出:
日志数据、结果、属性
“MapRecord[{product=w1,Location=APAC}],”[MapRecord[{limit=0,result=pass,pri=3}],MapRecord[{limit=1,result=pass,pri=2}],MapRecord[{limit=5,result=fail}],“MapRecord[{datetime=2018-01-10 00:36:00,vers=1}]”
ConvertRecord--我正在使用JSONTreereader和CSVRecordSSetwriter配置,如下所示:
JSONTreereader控制器服务配置:
CSVRecordSetwriter控制器服务配置:
AvroschemaRegistry控制器服务配置:
Avro模式:
{“名称”:“myschema”,“类型”:“记录”,“名称空间”:“myschema”,“字段”:[{“名称”:“日志数据”,“类型”:“{“名称”:“日志数据”,“类型”:“记录”,“字段”:[{“名称”:“位置”,“类型”:“字符串”},{“名称”:“产品”,“类型”:“字符串”}}},{“名称”:“结果”,“类型”:“数组”,“项目”:“{“名称”:“结果”;“结果”;“记录”,“类型”:“记录”,“字段”:[{“名称”:“限制”,“类型”:“字符串”},{“名称”:“优先级”,“类型”:[“字符串”,“空”]},{“名称”:“结果”,“类型”:“字符串”}}},{“名称”:“属性”,“类型”:“{“名称”:“属性”,“类型”:“记录”,“字段”:[{“名称”:“版本”,“类型”:“字符串”},{“名称”:“日期时间”,“类型”:“字符串”}}}}如果转换为CSV不起作用,您似乎需要在转换为CSV之前执行JoltTransform。如果转换为CSV不起作用,您似乎需要在转换为CSV之前执行JoltTransform。请在JoltTransform Fore ConvertRecord的JoltTransform中尝试此规范:
{
"operation": "shift",
"spec": {
"Outcome": {
"*": {
"@(3,LogData.Location)": "[#2].location",
"@(3,LogData.product)": "[#2].product",
"@(3,attr.vers)": "[#2].vers",
"@(3,attr.datetime)": "[#2].datetime",
"*": "[#2].&"
}
}
}
}
]```
在转换记录之前,在JoltTransferMJSON中尝试此规范:
{
"operation": "shift",
"spec": {
"Outcome": {
"*": {
"@(3,LogData.Location)": "[#2].location",
"@(3,LogData.product)": "[#2].product",
"@(3,attr.vers)": "[#2].vers",
"@(3,attr.datetime)": "[#2].datetime",
"*": "[#2].&"
}
}
}
}
]```
非常感谢@mattyb的帮助。这就像一个符咒。一个问题:如果我在结果中有1300+个数组元素:[],将1条传入json记录转换为1300多条json记录时,jolt转换是否工作正常,或者会有任何开销?不确定您所说的开销是什么意思,但我可以告诉您,一旦所有1300多条流文件都完成了处理并提交了会话,它们将同时被传输。感谢a ton@mattyb的帮助。Thi有一个问题:如果我在结果中有1300+个数组元素:[],将1条传入json记录转换为1300多条json记录时,jolt转换是否工作正常,或者是否会有任何开销?不确定您所说的开销是什么意思,但我可以告诉您,所有1300多条流文件都将在处理完并提交会话后同时传输。