Apache Nifi 1.7替换文本处理器进行时间戳操作

时间:2018-09-25 14:47:41

标签: apache-nifi

我正在尝试使用Apache Nifi“替换文本”处理器从时间戳字段中提取年,月和日的值:

Search value: "happened":"([^"]+)"
Replacement Value: "happened":"${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("yyyy-MM-dd HH:mm:ss.SSS", '+00:00')}","year":"${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("yyyy", '+00:00')}","month":"${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("MM", '+00:00')}","day":"${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("dd", '+00:00')}"

我正在尝试转换:

"happened":"2018-03-28T10:52:44.35+02:00"

"happened":"2018-03-28 08:52:44.035","year":"2018","month":"03","day":"28"

这在Apache Nifi 1.4中很好用。

但是,在Nifi 1.7中,我得到了:

"happened":"2018-03-28 08:52:44.035","year":"","month":"","day":""

对此问题有感想。

2 个答案:

答案 0 :(得分:1)

如果您这样更改替换顺序,似乎$1只能被评估一次:

"happened":,"year":"${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("yyyy", '+00:00')}","month":"${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("MM", '+00:00')}","day":"${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("dd", '+00:00')}""${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("yyyy-MM-dd HH:mm:ss.SSS", '+00:00')}","year":"${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("yyyy", '+00:00')}","month":"${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("MM", '+00:00')}","day":"${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("dd", '+00:00')}"

您得到了:

"happened":,"year":"2018","month":"","day":"""","year":"","month":"","day":""

现在的重点是如何解决问题,我不知道您的具体要求是什么,但是对我来说,最简单的方法是:  -将日期提取到属性。  -使用此属性构造您需要的新值,就像在下面的表达式中一样。

happenedData = ${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("yyyy-MM-dd HH:mm:ss.SSS", '+00:00')}

happened = "happened":"${happenedData}","year":"${happenedData:format("yyyy", '+00:00')}","month":"${happenedData:format("MM", '+00:00')}","day":"${happenedData:format("dd", '+00:00')}"

答案 1 :(得分:0)

是的ÓscarAndreu是正确的-'$1'在表达式范围内仅计算一次,即-${'$1'}

但是我找不到提取到临时变量并重新使用它的方法。

但是,我发现$1可以多次使用。例如:

happened = "happened":${'$1':toDate("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"):format("yyyy-MM-dd HH:mm:ss.SSS", '+00:00')},"year":"$1","month":"$1",day:"$1"

输出:

"happened":"2018-03-28 08:52:44.035", "year":"2018-03-28T10:52:44.35+02:00", "month":"2018-03-28T10:52:44.35+02:00", "day":"2018-03-28T10:52:44.35+02:00"

此后,我又使用了三个ReplaceText处理器实例,分别分别用于年,月和日。似乎有点钝,但是可以。

相关问题