我目前正在Nifi中从FTP获取文件,但是在获取文件之前,我必须检查一些条件。这种情况是这样的。
列出FTP->检查条件->获取FTP
在“检查条件”部分中,我已从数据库中获取了一些值并与文件名进行了比较。那么我可以使用update属性从数据库中获取一些记录并使它像这样吗?
列表FTP->更新属性(从数据库)->在属性上路由->获取FTP
答案 0 :(得分:1)
我认为您的流程如下所示
流量:
1.ListFTP //to list the files
2.ExecuteSQL //to execute query in db(sample query:select max(timestamp) db_time from table)
3.ConvertAvroToJson //convert the result of executesql to json format
4.EvaluateJsonPath //keep destination as FlowfileAttribute and add new property as db_time as $.db_time
5.ROuteOnAttribute //perform check filename timestamp vs extracted timestamp by using nifi expresson language
6.FetchFile //if condition is true then fetch the file
RouteOnAttribute配置:
我认为文件名类似于 fn_2017-08-2012:09:10 ,executesql已返回 2017-08-2012:08:10
表达式:
${filename:substringAfter('_'):toDate("yyyy-MM-ddHH:mm:ss"):toNumber()
:gt(${db_time:toDate("yyyy-MM-ddHH:mm:ss"):toNumber()})}
通过使用上述表达式,我们获得了filename value same as ListFTP
文件名,并使用db_time
处理器添加了EvaluateJsonPath
属性,并且我们将时间戳更改为数字然后进行了比较。
有关NiFi表达式语言的更多详细信息,请参见this链接。
答案 1 :(得分:1)
因此,如果我正确理解您的用例,就好像您将外部数据库仅用于跟踪目的。因此,我猜只有最新的处理时间戳就足够了。在这种情况下,我建议您使用NiFi提供的DistributedCache
处理器和ControllerService,而不要依赖外部DB。
使用这种方法,您的流程将像:
ListFile --> FetchDistributedMapCache --(success)--> RouteOnAttribute -> FetchFile
配置FetchDistributedMapCache
lastProcessedTime
latestTimestamp
或lastProcessedTime
配置RouteOnAttribute
Properties
标签中的(+)按钮创建新的动态关系。给它起一个名字,例如success
或matches
。假设您的文件名格式为somefile_1534824139
,即它具有名称和_
并附加了纪元时间戳。
在这种情况下,您可以利用NiFi Expression Language
并利用其提供的功能。因此,对于新的动态关系,您可以具有类似以下内容的表达式:
${filename:substringAfter('_'):gt(${lastProcessedTimestamp})}
这是假设您在FetchDistributedMapCache
中为属性Put Cache Value In Attribute
配置了值lastProcessedTimestamp
。
有用链接