我有一个NiFi流程(可以运行),该流程可将一个大型电子表格按公司名称拆分为单独的csv
。
例如
GetFile -> SplitText -> PartitionRecord -> MergeContent ->
UpdateAttribute -> PutFile
例如,将其显示出来
问题来自csv
这样的问题,在同一公司输入的内容略有不同:
我知道我需要在此处放置ExecuteScript
处理器。我需要将所有这样的重复项合并到一个文件中,而不必梳理数千行来挑选以多种方式输入的每个公司。
我认为这可以通过Groovy轻松完成:
flowFile = session.get()
if(!flowFile) return
myAttr = flowFile.getAttribute('filename')
不确定从这里要去哪里。
答案 0 :(得分:2)
您可以使用 UpdateAttribute 处理器 Adavanced 用法合并所有重复项,然后将文件存储到目录中.. !!
流量:
GetFile -> SplitText -> PartitionRecord -> UpdateAttribute-> MergeContent
-> PutFile
UpdateAttribute配置:
在PartitionRecord处理器之后,您将基于该属性值将分区字段作为流文件的属性,您可以编写如下规则:
${partition_field_name:toLower():contains("campbell")}
在上述规则中,我们正在检查partition_field_name属性值是否包含Campbell,像这样使用 NiFI表达式语言,并添加您的逻辑以识别各种分区值并执行所需的操作。
如果是,那么我们要添加flowfile属性,即
文件名,值为campbell.csv
然后在“合并内容”处理器中将以下属性配置为 相关属性名称-> 文件名 现在所有相同类型的文件都将合并在一起。
如果您采用这种方法,则需要更改PutFile
的配置
冲突解决策略,因为我们将再次使用相同的文件名。
(或)
最好是根据partition_value在第一个UpdateAttribute中创建目录属性。
然后使用具有关联属性名称作为目录的MergeContent Processor,现在我们合并了属于同一目录的所有文件。
然后使用另一个UpdateAttribute Processor将文件名更改为唯一值,例如UUID (or) timestamp..etc
。
使用PutFile处理器根据目录属性值动态存储数据。
流量:
GetFile
-> SplitText
-> PartitionRecord
-> UpdateAttribute //add directory attribute
-> MergeContent
-> UpdateAttribute //change filename to ${UUID()}
-> PutFile