我是python和nifi的新手。
我的流程是GetFile - > ExecuteScript
在脚本中,对于每个json,我想访问一个特定元素并逐行将其写入文本文件。
我尝试了以下内容:
import json
import java.io
from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets
from org.apache.nifi.processor.io import StreamCallback
class ModJSON(StreamCallback):
def __init__(self):
pass
def process(self, inputStream, outputStream):
text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
json_content = json.loads(text)
try:
body = json_content['id']['body']
body_encoded = body.encode('utf-8')
except (KeyError,TypeError,ValueError):
body_encoded = ''
text_file = open ('/tmp/test/testFile.txt', 'w')
text_file.write("%s"%body_encoded)
text_file.close()
outputStream.write(bytearray(json.dumps(body, indent=4).encode('utf-8')))
flowFile = session.get()
if (flowFile != None):
flowFile = session.write(flowFile, ModJSON())
flowFile = session.putAttribute(flowFile, "filename", flowFile.getAttribute('filename').split('.')[0]+'_translated.json')
session.transfer(flowFile, REL_SUCCESS)
但是在testFile.txt中,没有写入被访问的主体。
我在这里想念什么?
答案 0 :(得分:3)
Python类的主体不是缩进的,也不是流程方法的主体。尝试通过outputStream.write行从def init 行缩进一个级别,然后再通过outputStream.write行从text = IOUtils.toString行缩进一个级别,这应该会给你一个工作的StreamCallback class并使脚本正常工作。
此外,您不需要调用session.commit(),这将在脚本完成时为您调用。
编辑(由于OP编辑 - 请参阅注释):上面的脚本仍然没有正确缩进,process()方法的主体需要缩进。您是否在ExecuteScript处理器上收到错误或公告?如果传入的流文件在ExecuteScript之前排队,那么“flowFile = session.get()”没有被执行,或者处理器应该抛出错误并发布公告(右上角的红框)。
此外,由于您打算在流文件中从处理器发送相同的内容,因此您不需要“text_file”代码,我认为这是用于调试的?