也许这是一个愚蠢的问题,但是我不得不问。
我在Nifi中有一个Collect_data处理器,它将消息流传输到另一个进程,该进程使用python脚本来解析该消息并创建json文件。问题是我不知道python脚本中函数的输入是什么。如何将这些消息(16位数字)从Collect_data处理器传递到下一个处理器,其中包含python脚本。是否有任何良好的基本示例?
我已经在网上寻找一些示例,但是并没有真正得到它。
import datetime
import hashlib
from urlparse import urlparse, parse_qs
import sys
from urlparse import urlparse, parse_qs
from datetime import *
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
from time import time
def parse_zap(inputStream, outputStream):
data = inputStream
buf = (hashlib.sha256(bytearray.fromhex(data)).hexdigest())
buf = int(buf, 16)
buf_check = str(buf)
if buf_check[17] == 2:
pass
datetime_now = datetime.now()
log_date = datetime_now.isoformat()
try:
mac = buf_check[7:14].upper()
ams_id = buf_check[8:]
action = buf_check[3:4]
time_a = int(time())
dict_test = {
"user": {
"guruq" : 'false'
},
"device" : {
"type" : "siolbox",
"mac": mac
},
"event" : {
"origin" : "iptv",
"timestamp": time_a,
"type": "zap",
"product-type" : "tv-channel",
"channel": {
"id" : 'channel_id',
"ams-id": ams_id
},
"content": {
"action": action
}
}
}
return dict_test
except Exception as e:
print('%s nod PARSE 500 \"%s\"' % (log_date, e))
谢谢,我阅读正确,但是现在我无法创建输出。 预先感谢。
答案 0 :(得分:3)
我想我理解您的问题,但这对您的流程有些含糊。我在回答几种可能的情况。
FetchFTP
)获取数据,并与ExecuteScript
处理器具有连接,该处理器包含用于转换这些值的Python脚本。在这种情况下,Python脚本可以直接使用标准API对流文件属性和内容进行操作。有关编写用于对数据进行操作的自定义脚本的许多示例,请参见Matt Burgess' blog。 ExecuteStreamCommand
处理器建立连接,该处理器使用诸如python my_external_script.py arg1 arg2 ...
之类的命令调用外部Python脚本。在这种情况下,流文件内容由STDIN
处理器传递到ExecuteStreamCommand
,因此您的脚本应以这种方式使用它。 This answer explains更多有关将ExecuteStreamCommand
与Python脚本一起使用的信息。 如果您的Python脚本非常简单,则可以将其放在ScriptedRecordWriter
中,并使用该脚本同时处理多个“记录”以获得性能上的好处。对于您的用例,这可能是高级的,具体取决于您的流和传入数据的外观。
更新2018-10-03 10:50
尝试在ExecuteScript
正文中使用此脚本:
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 PyStreamCallback(StreamCallback):
def __init__(self):
pass
def process(self, inputStream, outputStream):
text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
result = parse_zap(text)
outputStream.write(bytearray(result.encode('utf-8')))
flowFile = session.get()
if (flowFile != None):
flowFile = session.write(flowFile,PyStreamCallback())
flowFile = session.putAttribute(flowFile, "parsed_zap", "true")
session.transfer(flowFile, REL_SUCCESS)
// Your parse_zap() method here, with the signature changed to just accept a single string
...
答案 1 :(得分:3)
看看这个脚本:
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 PyStreamCallback(StreamCallback):
def __init__(self):
pass
def process(self, inputStream, outputStream):
text = IOUtils.readLines(inputStream, StandardCharsets.UTF_8)
for line in text[1:]:
outputStream.write(line + "\n")
flowFile = session.get()
if (flowFile != None):
flowFile = session.write(flowFile,PyStreamCallback())
flowFile = session.putAttribute(flowFile, "filename", flowFile.getAttribute('filename').split('.')[0]+'_translated.json')
session.transfer(flowFile, REL_SUCCESS)
它从属性中获取要从流文件中删除的行数,然后获取流文件并在没有此行的情况下再次写入它,这是一个简单而又很好的示例,说明了如何使用这些属性以及如何使用流文件。
基于更新后的代码,您的代码必须如下所示:
import datetime
import hashlib
from urlparse import urlparse, parse_qs
import sys
from urlparse import urlparse, parse_qs
from datetime import *
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
from time import time
class PyStreamCallback(StreamCallback):
def __init__(self):
pass
def process(self, inputStream, outputStream):
data = inputStream
buf = (hashlib.sha256(bytearray.fromhex(data)).hexdigest())
buf = int(buf, 16)
buf_check = str(buf)
if buf_check[17] == 2:
pass
datetime_now = datetime.now()
log_date = datetime_now.isoformat()
try:
mac = buf_check[7:14].upper()
ams_id = buf_check[8:]
action = buf_check[3:4]
time_a = int(time())
dict_test = {
"user": {
"guruq" : 'false'
},
"device" : {
"type" : "siolbox",
"mac": mac
},
"event" : {
"origin" : "iptv",
"timestamp": time_a,
"type": "zap",
"product-type" : "tv-channel",
"channel": {
"id" : 'channel_id',
"ams-id": ams_id
},
"content": {
"action": action
}
}
}
return dict_test
except Exception as e:
print('%s nod PARSE 500 \"%s\"' % (log_date, e))
flowFile = session.get()
if (flowFile != None):
flowFile = session.write(flowFile,PyStreamCallback())
flowFile = session.putAttribute(flowFile, "filename", flowFile.getAttribute('filename').split('.')[0]+'_translated.json')
session.transfer(flowFile, REL_SUCCESS)