Hadoop Nifi:捕获文件名的中间部分

Hadoop Nifi:捕获文件名的中间部分,hadoop,expression,apache-nifi,Hadoop,Expression,Apache Nifi,我有许多文件要发送到HDFS,命名约定如下: acme_受益人_20190820 acme_统计数据20190820 acme_规定_20190820 acme_赞助商_20190820 我想使用下划线之间的段作为变量来生成HDFS路径,因此它看起来像这样: /我的/hdfs/目录/赞助商/2019/ 我发现了一种分两步完成的方法,但我认为一定有一种方法可以一步完成。对于第一步,我有一个“更新属性”处理器,它创建一个变量“file_src”,其值如下: ${filename:substrin

我有许多文件要发送到HDFS,命名约定如下:

  • acme_受益人_20190820
  • acme_统计数据20190820
  • acme_规定_20190820
  • acme_赞助商_20190820
我想使用下划线之间的段作为变量来生成HDFS路径,因此它看起来像这样:

/我的/hdfs/目录/赞助商/2019/

我发现了一种分两步完成的方法,但我认为一定有一种方法可以一步完成。对于第一步,我有一个“更新属性”处理器,它创建一个变量“file_src”,其值如下:

${filename:substringAfter('_')}
${file_src:substringBefore('_'):toLower()}
因此,现在它将文件名视为“受益人_20190820”,等等。在此之后,我有另一个“更新属性”处理器,其变量名为“dest”,具有以下值:

${filename:substringAfter('_')}
${file_src:substringBefore('_'):toLower()}
现在我的hdfs目录可以是这样的:

/my/hdfs/directory/${dest}/2019


它能工作,但感觉笨重。有没有一种方法可以一步到位?我觉得这些表达式可能是嵌套的或者其他的。提前感谢您的帮助。

将所有内容集中在一个表达式中

${filename:substringAfter('_'):substringBefore('_'):toLower()}
您甚至可以在hdfs目录表达式中直接使用此表达式,而无需UpdateAttribute:

/my/hdfs/directory/${filename:substringAfter('_'):substringBefore('_'):toLower()}/2019

把一切都放在一个表达中

${filename:substringAfter('_'):substringBefore('_'):toLower()}
您甚至可以在hdfs目录表达式中直接使用此表达式,而无需UpdateAttribute:

/my/hdfs/directory/${filename:substringAfter('_'):substringBefore('_'):toLower()}/2019