如何将流文件传递到Execute Python脚本并使用属性和Nifi变量存储该文件?

时间:2019-05-10 14:08:36

标签: python json csv apache-nifi

我是NiFi和Python的新手,我需要您的帮助才能将Flow File属性值传递给脚本。该脚本将嵌套的json转换为csv。当我在本地运行脚本时,它可以工作。

如何将FlowFile名称传递给src_json和tgt_csv?

谢谢

罗莎

ax.boxplot(data1, vert=False, vert=False)

1 个答案:

答案 0 :(得分:0)

您可以选择几种方法来完成此任务。

  1. 正如 Arun211 所指出的那样,现有的ConvertRecord处理器可以很大程度上完成此任务。如果您的嵌套JSON有问题,或者您有其他原因想要在Python脚本中执行此操作,请继续以下操作。
  2. 如果您已有一个执行上述任务的Python脚本,则需要在将数据提供给脚本的同时从NiFi调用它。您可以使用:
    1. ExecuteScript(更适合原型设计)和InvokeScriptedProcessor(更能执行生产任务)使您可以在NiFi实例中运行Python(实际上是 Jython )脚本。这使您可以直接访问一些便捷的方法和功能。但是,由于Jython无法处理本地编译的Python库,因此您将无法在此代码中使用pandasSee here for instructions on configuring this processorhere for why pandas will not work
    2. 如果需要 pandas以获得某些功能,则需要将脚本另存为Python文件在本地文件系统上,并使用{{3 }}(如果需要向此处理器提供输入)或ExecuteStreamCommand(如果它是流程中的第一个处理器)。这些处理器实际上运行诸如python my_python_script_with_pandas.py -somearg(在ExecuteProcess中)或python my_python_script_with_pandas.py这样的shell命令,流文件内容为STDIN(在ExecuteStreamCommand中),并且{ {1}}被捕获为结果流文件内容。

当前,您的脚本正在静态文件位置查找传入的JSON文件,并将生成的CSV放置在另一个静态文件位置。您将需要更改脚本以执行以下操作之一:

  1. 从命令行参数读取这些路径,并将其传递到所选处理器的相关处理器属性中。这些属性可以从 flowfile属性填充,因此您可以执行类似 Command Arguments STDOUT或它们的任意组合的操作。然后,您的脚本将读取-inputfile /path/to/some_existing_file.json -outputfile ${flowfile_attribute_named_output_file}-inputfile参数来确定路径。
  2. 直接从-outputfile ExecuteProcess中读取传入的数据。然后处理JSON数据,将其转换为CSV,然后通过STDIN返回。 NiFi会使用此数据,将其作为结果流文件的内容放置,然后将其发送到流中的下一个处理器。
  3. 前两个选项可让您的Python脚本独立于NiFi;它不知道任何“ flowfile”结构。此选项将使其特定于NiFi,但允许进一步的功能(请参阅上面的选项2.1)。要编写直接从流文件内容读取和向流文件内容写入的Python代码,请参阅此example here