Sql 如何使用QueryRecord从JSON对象提取字段
我为这个问题挣扎了很长时间。我需要通过从输入JSON字段refs和跳过对象字段中获取数组(字段ref),使用QueryRecord创建一个新的JSON流文件,如下例所示: 输入JSON流文件 查询记录配置 JSONTreeReader设置为推断模式和JSONRecordSetWriterSql 如何使用QueryRecord从JSON对象提取字段,sql,json,apache-nifi,apache-calcite,Sql,Json,Apache Nifi,Apache Calcite,我为这个问题挣扎了很长时间。我需要通过从输入JSON字段refs和跳过对象字段中获取数组(字段ref),使用QueryRecord创建一个新的JSON流文件,如下例所示: 输入JSON流文件 查询记录配置 JSONTreeReader设置为推断模式和JSONRecordSetWriter 选择名称、描述(数组[rpath(refs,//ref[*]))作为流文件的源 输出JSON(需要) 但有一个错误: 由于java.lang.ClassCastException:null的原因,QueryR
选择名称、描述(数组[rpath(refs,//ref[*]))作为流文件的源
输出JSON(需要)
但有一个错误:
由于java.lang.ClassCastException:null的原因,
QueryRecord未能将模式为[“name”:“STRING”、“description”:“STRING”、“references”:“ARRAY[STRING]”的MapRecord[{references=[Ljava.lang.Object;@27fd935f,description=full1,name=name1}]写入JSON对象,请尝试以下方法,在您的情况下应该可以:
1) 完全阅读JSON字段(我用GenerateFlowFile processor模拟了您的示例)
2) 添加EvaluateJsonPath处理器,该处理器将在属性中放入2个头文件(名称、描述):
3) 添加SplitJson处理器,该处理器将按ref/ref/groups分割JSON(按“$.refs.ref”分割):
4) 添加ReplaceText processor,它将向拆分行添加标题字段(名称,desc)(将“[{]”值替换为“{”名称“${json.name}”,“desc”:“${json.desc}”和“):
5) 完成了:
在我的演示案例中的完整过程:
希望这有帮助。解决方案!:使用JoltTransferMJSON通过Jolt规范转换JSON。规范。谢谢!当然,这并不能解决使用sql查询的单个QueryRecord元素中的问题,但它会导致搜索其他解决方案。
{
"name": "name1",
"desc": "full1",
"refs": {
"ref": [
{
"source": "source1",
"url": "url1"
},
{
"source": "source2",
"url": "url2"
}
]
}
}
{
"name": "name1",
"desc": "full1",
"references": [
{
"source": "source1",
"url": "url1"
},
{
"source": "source2",
"url": "url2"
}
]
}