Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在apache nifi中使用executescript处理器更新csv值失败_Python_Csv_Apache Nifi - Fatal编程技术网

Python 在apache nifi中使用executescript处理器更新csv值失败

Python 在apache nifi中使用executescript处理器更新csv值失败,python,csv,apache-nifi,Python,Csv,Apache Nifi,我尝试从流文件中读取数据,并使用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 f

我尝试从流文件中读取数据,并使用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:“非类型”对象在中没有属性“getAttribute” 第13行的脚本

它说
record=flowfile.getAttribute('record\u type')
这是错误的


我不知道如何解决这个问题,因为我不擅长
python

这不是python,但根据作者的评论,可能是groovy

将ExecuteGroovyScript处理器与以下代码一起使用:

def ff=session.get()
如果(!ff)返回
定义映射=[
“0”:“新用户”,
“1”:“旧用户”,
]
ff.写入{rawIn,rawOut->
rawOut.withWriter(“UTF-8”){w->
rawIn.withReader(“UTF-8”){r->
int rowNum=0
//迭代输入流中的行,并使用coma拆分每个行
r、 splitEachLine(','){row->
如果(rowNum>0){
//如果不是标题行,则使用map替换值
行[1]=映射[行[1]]?:“忽略”
}
//将行连接并写入输出写入器

这不是python,但根据作者的评论,它可能是groovy

将ExecuteGroovyScript处理器与以下代码一起使用:

def ff=session.get()
如果(!ff)返回
定义映射=[
“0”:“新用户”,
“1”:“旧用户”,
]
ff.写入{rawIn,rawOut->
rawOut.withWriter(“UTF-8”){w->
rawIn.withReader(“UTF-8”){r->
int rowNum=0
//迭代输入流中的行,并使用coma拆分每个行
r、 splitEachLine(','){row->
如果(rowNum>0){
//如果不是标题行,则使用map替换值
行[1]=映射[行[1]]?:“忽略”
}
//将行连接并写入输出写入器


w ExecuteScript处理整个文件(不是通过记录)。getAttribute返回属性(如文件名)而不是内容。若要更改内容,请使用
flowFile。编写
函数。在inet中搜索
nifi python cookbook
,并查看示例。@daggett感谢您的建议。但我仍然不明白如何获取值进行比较。如果您不擅长python,可能最好使用记录处理。检查更新记录p处理器。@daggett是的,我使用了
UpdateRecord
处理器,但在问题中所述的一步中替换多个值时遇到了问题。您有基于记录的
if
,我认为在您的案例中可以使用UpdateRecord。我可以演示如何为您的案例编写groovy脚本…(我在python方面也很差)ExecuteScript处理整个文件(不是通过记录)。getAttribute返回属性(如文件名)而不是内容。若要更改内容,请使用
flowFile。编写
函数。在inet中搜索
nifi python cookbook
,并查看示例。@daggett感谢您的建议。但我仍然不明白如何获取值进行比较。如果您不擅长python,可能最好使用记录处理。检查更新记录p处理器。@daggett是的,我使用了
UpdateRecord
处理器,但在问题中所述的一步中替换多个值时遇到了问题。您有基于记录的
if
,我认为在您的案例中可以使用UpdateRecord。我可以演示如何为您的案例编写groovy脚本…(我在python方面也很差)我接受这个答案,因为它解决了我的问题。这是一个子问题,如果我们想比较
字符串
,我们需要对此做什么样的修改?在这个脚本中,所有内容都是字符串(除了rowNum)甚至它也包含数字。
'0'
是一个字符串。我用一个定义为“从标题使用字符串”的列尝试了它,但它没有像前面的示例那样正常工作。你的意思是你想从标题按名称而不是按数字来评估列?我接受这个答案,因为它解决了我的问题。如果我们想比较string
,我们需要对此进行什么样的修改?在这个脚本中,所有内容都是string(除了rowNum)甚至它也包含数字。
'0'
是一个字符串。我用一个定义为“从标题使用字符串”的列尝试了它,但它没有像前面的示例那样正常工作。您的意思是要按标题中的名称而不是按数字来评估列?