访问Json元素并使用python ExecuteScript处理器写入文本文件

时间:2016-11-16 11:08:52

标签: python-2.7 apache-nifi

flow

我是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中,没有写入被访问的主体。

我在这里想念什么?

1 个答案:

答案 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”代码,我认为这是用于调试的?