【发布时间】:2020-03-10 00:34:03
【问题描述】:
我尝试从流文件中读取并使用 csv 中的默认值更新记录值。为此,我使用了 ExecuteScript 处理器,其中包含以下 python 代码。
import sys
import re
import traceback
from org.apache.commons.io import IOUtils
from org.apache.nifi.processor.io import StreamCallback
from org.python.core.util import StringUtil
from java.lang import Class
from java.io import BufferedReader
from java.io import InputStreamReader
from java.io import OutputStreamWriter
flowfile = session.get()
record = flowfile.getAttribute('record_type')
if record == '0':
flowfile = session.putAttribute(flowfile,'record_type', 'NEW_USER')
session.transfer(flowFile, REL_SUCCESS)
session.commit()
elif record == '1':
flowfile = session.putAttribute(flowfile,'record_type', 'OLD_USER')
session.transfer(flowFile, REL_SUCCESS)
session.commit()
else:
flowfile = session.putAttribute(flowfile,'record_type', 'IGNORE')
session.transfer(flowFile, REL_SUCCESS)
session.commit()
writer.flush()
writer.close()
reader.close()
我的 csv 看起来像
id,record_type
1,0
2,1
3,2
4,0
结果应该是:
id,record_type
1,NEW_USER
2,OLD_USER
3,IGNORE
4,NEW_USER
我收到以下错误:
AttributeError : 'NoneType' 对象在中没有属性 'getAttribute' 第 13 行的脚本
上面写着record = flowfile.getAttribute('record_type')这是错误的..
我不知道如何解决这个问题,因为我不擅长 python。
【问题讨论】:
-
ExecuteScript 处理整个文件(不是按记录)。 getAttribute 返回属性(如文件名)而不是内容。要更改内容,请使用
flowFile.write函数。在inet 中搜索nifi python cookbook并查看示例。 -
@daggett 感谢您的建议。但我仍然不明白如何获得一个值来比较。
-
如果你不擅长python,使用记录处理可能会更好。检查 UpdateRecord 处理器。
-
@daggett 是的,我使用过
UpdateRecord处理器,但是如问题中所述,在一步替换多个值时遇到问题。 -
您有基于记录的
if,我认为在您的情况下可以使用 UpdateRecord。我可以展示如何为你的案例做 groovy 脚本..(我在 python 中也很糟糕)
标签: python csv apache-nifi