我正在尝试在Nifi ExecuteStreamCommand处理器中运行python代码。
该代码包含非纯python模块(例如Pandas和Numpy),因此不能使用Nifi executeScript。
问题在于读取流文件和修改流文件内容。
显然,可以使用STDIN读取传入的流文件并使用STDOUT进行写出,请参见以下SO问题: Python Script using ExecuteStreamCommand
但是我无法使它正常工作。
1。 尝试仅从STDIN读取CSV并进行修改,但是当发送到putFile处理器时,文件是相同的。
import sys
import pandas as pd
import io
df = pd.read_csv(io.StringIO(sys.stdin.read(1)))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
df2 = df.append(df2)
2。 尝试将其他一些代码包装在函数中,并假设函数输出将输出到STDOUT,但结果相同,则返回。
def convert_csv_dataframe():
a = pd.read_csv(io.StringIO(sys.stdin.read(1)))
a.replace(["ABC", "AB"], "A", inplace=True)
return a
convert_csv_dataframe()
如果有人可以帮助,将不胜感激。
编辑:
此代码有效。问题出在Nifi。我是从“原始”关系而不是“输出流”关系中读取的。请注意,stdin正在读取一行,但不要认为这应该有所作为。我唯一的问题是:是否可以从executeStreamCommand引用流文件本身(而不是其内容)?
import sys
a = sys.stdin.readline()
a = a.upper()
sys.stdout.write(a)
答案 0 :(得分:1)
我认为您需要在脚本中的某处写入STDOUT。我对Python的了解并不多,但是这两个示例都看起来像您从STDIN读取然后修改了内存中的数据,但从未将其写回。