在Apache Nifi ExecuteStreamCommand

时间:2019-02-19 09:01:41

标签: python pandas apache-nifi

我正在尝试在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)

1 个答案:

答案 0 :(得分:1)

我认为您需要在脚本中的某处写入STDOUT。我对Python的了解并不多,但是这两个示例都看起来像您从STDIN读取然后修改了内存中的数据,但从未将其写回。