Apache nifi ApacheNIFI 1.7取代文本处理器进行时间戳操作

Apache nifi ApacheNIFI 1.7取代文本处理器进行时间戳操作,apache-nifi,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.SSSXX

我试图使用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"

这在ApacheNIFI 1.4中运行良好

然而,在Nifi 1.7中,我得到:

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

感谢您对这个问题的看法

如果您这样更改替换顺序,
$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')}"

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

但是我找不到一种方法来提取一个临时变量并重用它

然而,我注意到,
$1
可以多次使用。例如:

Occessed=“Occessed”:${'1':toDate(“yyyy-MM-dd'T'HH:MM:ss.SSSXXX”):格式(“yyyy-MM-dd-HH:MM:ss.SSS”,“+00:00”),“年”:“$1”,“月”:“$1”,天:$1”

产出:

“发生”:“2018-03-28 08:52:44.035”,“年”:“2018-03-28T10:52:44.35+02:00”,“月”:“2018-03-28T10:52:44.35+02:00”,“日”:“2018-03-28T10:52:44.35+02:00”

之后,我又使用了三个replacetextprocessor实例,分别用于年、月和日。看起来有点迟钝,但它是有效的

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')}"