我的工作流程如下所示。
ListenHTTP(我在这里得到一个目录名) - > SplitText - > ExtractText(作为属性添加的目录名称)
此后,我将不得不使用该属性directoryname并提取该本地目录中的所有文件并将其放入HDFS。我理解GetFile / ListFile可以做到这一点,但我们如何为该处理器提供动态目录名?
答案 0 :(得分:2)
不幸的是,GetFile
和ListFile
都是源处理器,这意味着它们不接受传入的流文件。一般模式是使用静态输入目录值配置这些处理器,并允许它们从中读取并管理其状态。
在这种情况下,我认为您需要使用FetchFile
,它接受传入的流文件并读取提供的文件路径。默认情况下,要提取的文件属性设置为${absolute.path}/${filename}
,这意味着它使用Apache NiFi Expression Language来解析这两个属性的值传入的流文件。您可以先将该流文件传递给ExecuteStreamCommand
处理器,然后在该目录上执行ls
,然后将结果拆分为单个流文件,每行一个文件名,并通过{{1}处理每个文件。 }。
我知道这不是执行任务最简洁的方法。另外两个建议是:
FetchFile
处理器。处理器只需从传入的流文件中提取属性,并使用Groovy / Ruby / Python /等。从目录中检索文件的设施,或执行目录列表并将单个流文件下游传递给ExecuteScript
处理器。