Nifi从数据库添加属性

时间:2018-08-21 02:21:11

标签: apache-nifi

我目前正在Nifi中从FTP获取文件,但是在获取文件之前,我必须检查一些条件。这种情况是这样的。

列出FTP->检查条件->获取FTP

在“检查条件”部分中,我已从数据库中获取了一些值并与文件名进行了比较。那么我可以使用update属性从数据库中获取一些记录并使它像这样吗?

列表FTP->更新属性(从数据库)->在属性上路由->获取FTP

2 个答案:

答案 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

enter image description here

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链接。

enter image description here

答案 1 :(得分:1)

因此,如果我正确理解您的用例,就好像您将外部数据库仅用于跟踪目的。因此,我猜只有最新的处理时间戳就足够了。在这种情况下,我建议您使用NiFi提供的DistributedCache处理器和ControllerService,而不要依赖外部DB。

使用这种方法,您的流程将像:

ListFile --> FetchDistributedMapCache --(success)--> RouteOnAttribute -> FetchFile

配置FetchDistributedMapCache

  • 缓存条目标识符-这是缓存的密钥。将其设置为lastProcessedTime
  • 在属性中添加缓存值-您在此处输入的任何名称都将作为FlowFile属性添加,其值为缓存值。提供一个名称,例如latestTimestamplastProcessedTime

配置RouteOnAttribute

通过点击Properties标签中的(+)按钮

创建新的动态关系。给它起一个名字,例如successmatches。假设您的文件名格式为somefile_1534824139,即它具有名称和_并附加了纪元时间戳。

在这种情况下,您可以利用NiFi Expression Language并利用其提供的功能。因此,对于新的动态关系,您可以具有类似以下内容的表达式:

  • 成功-${filename:substringAfter('_'):gt(${lastProcessedTimestamp})}

这是假设您在FetchDistributedMapCache中为属性Put Cache Value In Attribute配置了值lastProcessedTimestamp

有用链接