Apache nifi 如何在NiFi上对大型Json文件进行两阶段拆分
我使用NiFi进行恢复,并将许多数据放入卡夫卡。我实际上处于测试阶段,我正在使用一个大的Json文件 我的Json文件包含500K条录音 实际上,我有一个处理器Apache nifi 如何在NiFi上对大型Json文件进行两阶段拆分,apache-nifi,Apache Nifi,我使用NiFi进行恢复,并将许多数据放入卡夫卡。我实际上处于测试阶段,我正在使用一个大的Json文件 我的Json文件包含500K条录音 实际上,我有一个处理器getFile用于获取文件,还有一个SplitJson JsonPath表达式:$…posts. 这种配置适用于包含50K录制的小文件,但对于大文件,她崩溃了 我的Json文件是这样的,在“posts”中有500K个注册表:[] { "meta":{ "requestid":"request1000",
getFile
用于获取文件,还有一个SplitJson
JsonPath表达式:$…posts.
这种配置适用于包含50K录制的小文件,但对于大文件,她崩溃了
我的Json文件是这样的,在“posts”中有500K个注册表:[]
{
"meta":{
"requestid":"request1000",
"http_code":200,
"network":"twitter",
"query_type":"realtime",
"limit":10,
"page":0
},
"posts":[
{
"network":"twitter",
"posted":"posted1",
"postid":"id1",
"text":"text1",
"lang":"lang1",
"type":"type1",
"sentiment":"sentiment1",
"url":"url1"
},
{
"network":"twitter",
"posted":"posted2",
"postid":"id2",
"text":"text2",
"lang":"lang2",
"type":"type2",
"sentiment":"sentiment2",
"url":"url2"
}
]
}
我阅读了一些关于这个问题的文档,但主题是文本文件,发言者建议链接许多SplitText
以逐步拆分文件。对于像我的Json这样的僵硬结构,我不明白如何才能做到这一点
我正在寻找一个解决方案,让她能够很好地处理500K录音。尝试在NiFi中使用处理器
在SplitRecord processor中定义记录服务
然后将每次拆分的记录配置为1
,并使用Splits
关系进行进一步处理
(或)
如果你想平铺和分叉记录,那么在NiFi中使用处理器
用于此链接。不幸的是,我认为这种情况(记录中的大数组)现在处理得不是很好
SplitJson要求将整个流文件读入内存,并且它也没有传出拆分大小。所以这行不通
SplitRecord通常是正确的解决方案,但目前有两个JSON记录读取器—JSONterReader和JsonPathReader。这两个流记录,但这里的问题是只有一个巨大的记录,因此它们将各自将整个文档读入内存
围绕这个特定的问题已经做了一些努力,但不幸的是,没有一个已经发布
现在已关闭的PR添加了一个新的JSON记录读取器,它可以从JSON路径开始对记录进行流式处理,在您的情况下,可以是$.posts:
使用该阅读器,您甚至不需要进行拆分,只需将流文件发送到PublishKafkarRecord_2_0(或PublishKafkarRecord的任何适当版本),它将读取每条记录并发布到Kafka
新的SelectJson处理器也有一个开放的PR,看起来它可能会有帮助:
我对json也有同样的问题,并用于编写流式解析器
将ExeuteGroovyScript
处理器与
下面的代码
它应该将大的传入文件拆分为小文件:
@Grab(group='acme.groovy',module='acmejson',version='20200120')
导入groovyx.acme.json.AcmeJsonParser
导入groovyx.acme.json.AcmeJsonOutput
def ff=session.get()
如果(!ff)返回
def objMeta=null
def计数=0
ff.read().withReader(“UTF-8”){reader->
新建AcmeJsonParser().withFilter{
onValue('$.meta'){
//记住以后用
objMeta=it
}
onValue('$.posts.[*]'){objPost->
def ffOut=ff.clone(false)//不包含内容的克隆
ffOut.post_index=count//使用索引添加属性
//编写小型json
ffOut.write(“UTF-8”){writer->
writeJson([meta:objMeta,post:objPost],writer,true)
}
REL_SUCCESS你解决了这个问题吗?@daggett不,我会尝试读写器,但问题是一样的……我会尝试SplitRecord的解决方案,但问题是一样的。我使用的是Hortonworks,所以我认为JSON记录读取器没有在我的Nifi版本上实现。读写器控制器的问题是一样的。
{
"meta": {
"requestid": "request1000",
"http_code": 200,
"network": "twitter",
"query_type": "realtime",
"limit": 10,
"page": 0
},
"post": {
"network": "twitter",
"posted": "posted11",
"postid": "id11",
"text": "text11",
"lang": "lang11",
"type": "type11",
"sentiment": "sentiment11",
"url": "url11"
}
}