NiFi:为ExecuteScript处理器编写代码以合并多个条目

时间:2018-10-09 17:56:44

标签: groovy apache-nifi

我有一个NiFi流程(可以运行),该流程可将一个大型电子表格按公司名称拆分为单独的csv

例如

GetFile -> SplitText -> PartitionRecord -> MergeContent ->
UpdateAttribute -> PutFile

例如,将其显示出来

enter image description here

问题来自csv这样的问题,在同一公司输入的内容略有不同:

enter image description here

我知道我需要在此处放置ExecuteScript处理器。我需要将所有这样的重复项合并到一个文件中,而不必梳理数千行来挑选以多种方式输入的每个公司。

我认为这可以通过Groovy轻松完成:

flowFile = session.get()
if(!flowFile) return
myAttr = flowFile.getAttribute('filename')

不确定从这里要去哪里。

1 个答案:

答案 0 :(得分:2)

您可以使用 UpdateAttribute 处理器 Adavanced 用法合并所有重复项,然后将文件存储到目录中.. !!

流量:

GetFile -> SplitText -> PartitionRecord -> UpdateAttribute-> MergeContent
 -> PutFile

UpdateAttribute配置:

enter image description here

  1. 在PartitionRecord处理器之后,您将基于该属性值将分区字段作为流文件的属性,您可以编写如下规则:

    • 添加新规则 条件

    ${partition_field_name:toLower():contains("campbell")}

    在上述规则中,我们正在检查partition_field_name属性值是否包含Campbell,像这样使用 NiFI表达式语言,并添加您的逻辑以识别各种分区值并执行所需的操作。

  2. 如果是,那么我们要添加flowfile属性,即

    文件名,值为campbell.csv

  3. 然后在“合并内容”处理器中将以下属性配置为 相关属性名称-> 文件名 现在所有相同类型的文件都将合并在一起。

  4. 如果您采用这种方法,则需要更改PutFile的配置 冲突解决策略,因为我们将再次使用相同的文件名。

(或)

  1. 最好是根据partition_value在第一个UpdateAttribute中创建目录属性。

  2. 然后使用具有关联属性名称作为目录的MergeContent Processor,现在我们合并了属于同一目录的所有文件。

  3. 然后使用另一个UpdateAttribute Processor将文件名更改为唯一值,例如UUID (or) timestamp..etc

  4. 使用PutFile处理器根据目录属性值动态存储数据。

流量:

  GetFile 
  -> SplitText 
  -> PartitionRecord 
  -> UpdateAttribute //add directory attribute 
  -> MergeContent 
  -> UpdateAttribute //change filename to ${UUID()}
  -> PutFile