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

Groovy NiFi:为ExecuteScript处理器编写代码以合并多个条目,groovy,apache-nifi,Groovy,Apache Nifi,我有一个NiFi流程(可以使用),它可以将大量的电子表格按公司名称拆分为单独的csv 例如 这就把这个,比如说, 问题出现在类似这样的csv,同一家公司的输入略有不同: 我知道我需要在这里粘贴一个ExecuteScript处理器。我需要将所有这些副本合并到一个文件中,而不必梳理数千行来找出以多种方式输入的每个公司 我认为使用Groovy很容易做到这一点: flowFile = session.get() if(!flowFile) return myAttr = flowFile.getAt

我有一个NiFi流程(可以使用),它可以将大量的电子表格按公司名称拆分为单独的
csv

例如

这就把这个,比如说,

问题出现在类似这样的
csv
,同一家公司的输入略有不同:

我知道我需要在这里粘贴一个
ExecuteScript
处理器。我需要将所有这些副本合并到一个文件中,而不必梳理数千行来找出以多种方式输入的每个公司

我认为使用Groovy很容易做到这一点:

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

不确定从这里走到哪里。

您可以使用处理器用法将所有副本合并,然后将文件存储到目录中

流量:

GetFile -> SplitText -> PartitionRecord -> UpdateAttribute-> MergeContent
 -> PutFile
  GetFile 
  -> SplitText 
  -> PartitionRecord 
  -> UpdateAttribute //add directory attribute 
  -> MergeContent 
  -> UpdateAttribute //change filename to ${UUID()}
  -> PutFile
更新属性配置:

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

  • 在PartitionRecordProcessor之后,您将使用partition字段作为流文件的属性,基于此属性值,您可以编写如下规则

    • 使用添加新规则 条件
    ${partition\u field\u name:toLower():contains(“坎贝尔”)}

    在上面的规则中,我们检查partition\u field\u name属性值是否包含campbell,这样就可以使用NiFI表达式语言并添加逻辑来识别各种分区值并执行所需的操作

  • 如果是,那么我们将添加flowfile属性,即

    文件名值为
    campbell.csv

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

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

  • (或)

  • 如果您在第一个UpdateAttribute中基于分区的值设置目录属性,则会更好

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

  • 然后使用另一个UpdateAttribute处理器将文件名更改为唯一值,如
    UUID(或)timestamp..etc

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

  • 流量:

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

    您可以使用处理器用法将所有副本组合起来,然后将文件存储到目录中

    流量:

    GetFile -> SplitText -> PartitionRecord -> UpdateAttribute-> MergeContent
     -> PutFile
    
      GetFile 
      -> SplitText 
      -> PartitionRecord 
      -> UpdateAttribute //add directory attribute 
      -> MergeContent 
      -> UpdateAttribute //change filename to ${UUID()}
      -> PutFile
    
    更新属性配置:

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

  • 在PartitionRecordProcessor之后,您将使用partition字段作为流文件的属性,基于此属性值,您可以编写如下规则

    • 使用添加新规则 条件
    ${partition\u field\u name:toLower():contains(“坎贝尔”)}

    在上面的规则中,我们检查partition\u field\u name属性值是否包含campbell,这样就可以使用NiFI表达式语言并添加逻辑来识别各种分区值并执行所需的操作

  • 如果是,那么我们将添加flowfile属性,即

    文件名值为
    campbell.csv

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

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

  • (或)

  • 如果您在第一个UpdateAttribute中基于分区的值设置目录属性,则会更好

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

  • 然后使用另一个UpdateAttribute处理器将文件名更改为唯一值,如
    UUID(或)timestamp..etc

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

  • 流量:

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

    也许你可以在开始抓取之前重命名文件…是的,你可以在100多万行上尝试…可能你可以在开始抓取之前重命名文件…是的,你可以在100多万行上尝试。当你在第二节中说
    partition\u value
    时,你是否将
    ${partition\u field\uu}
    更改为
    ${partition\u value\u…}
    ?@papelr,不,我的意思是说基于
    ${partition\u field\u…}
    属性值创建另一个名为
    目录的属性
    并基于此目录属性值将文件存储到这些目录中。谢谢!如果我做了第二部分,我不需要做
    ${partition\u field\u name:toLower():contains(“campbell”)}
    ?只是为了让事情在我自己的生活中保持整洁head@papelr,仍然需要执行
    ${partition\u field\u name:toLower():contains(“campbell”)}
    获取目录属性值,然后根据目录属性值创建/保存文件到这些目录中..!!当您在第二节中说
    分区\u值
    时-您是否将
    ${partition\u字段\u…}
    更改为
    ${partition\u值\u…}
    ?@papelr,不,我的意思是说基于
    ${partition_field_…}
    属性值创建另一个名为
    director的属性