通过列的值拆分csv文件-Apache Nifi

时间:2018-12-12 22:41:35

标签: apache csv apache-nifi

我有一个csv文件,它具有以下结构。

ERP,J,JACKSON,8388 SOUTH CALIFORNIA ST.,TUCSON,AZ,85708,267-3352,,ALLENTON,MI,48002,810,710-0470,369-98-6555,462-11-4610,1953-05-00,F,
MARKETING,J,JACKSON,8388 SOUTH CALIFORNIA ST.,TUCSON,AZ,85708,267-3352,,ALLENTON,MI,48002,810,710-0470,369-98-6555,462-11-4610,1953-05-00,F,

您可以看到没有标题,但是为了您的信息,第一部分(第一列)代表获取数据的扇区。

我要做的取决于第一列的值,例如(MARKETING或ERP),我必须将所有这些行发送到另一个输出目录。

例如,所有带有ERP的行都位于/ output / ERP /              具有MARKETING的所有行到/ output / marketing /

我对此有一个想法,但是我的问题与我使用的RouteOnAttribute处理器有关,我不知道如何引用第一列并指出该值是什么(ERP或市场)稍后将其发送到正确的输出目录。

这是我的模式。

enter image description here

谢谢。

1 个答案:

答案 0 :(得分:3)

在这种情况下,请使用 PartitionRecord 处理器。

使用record reader/writer controller services配置处理器。即使您没有标题,也可以在avro模式中使用col1,col2 ... etc。

  • 添加新属性,该属性定义处理器以使用该字段对流文件进行分区。

现在分区记录处理器将partition field attribute与值相加,利用此属性值,我们可以dynamically store files动态地进入受尊重的目录。

流量:

1.GetFile
2.PartitionRecord
3.PutFile //configure directory as /output/${<keep_partition_field_name_here>}

请参考this链接以配置分区记录处理器的使用。

(或)

旧方法:

使用 RouteText 处理器而不是SplitText + RouteOnAttribute处理器

将RouteText处理器配置为

enter image description here

使用ERP/MARKETING连接连接到PutFile处理器,并使用RouteText.Route属性值将文件动态保存到目录中。

流量:

1.GetFile
2.RouteText
3.PutFile //configure directory as /output/${RouteText.Route}/

您还可以使用 Group正则表达式属性值创建分区。

注意

使用 PartitionRecord处理器将比RouteText处理器更有效