我正在尝试使用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":""
对此问题有感想。
答案 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处理器实例,分别分别用于年,月和日。似乎有点钝,但是可以。