1

我正在尝试使用 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":""

欣赏关于这个问题的想法。

4

2 回答 2

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')}"
于 2018-09-26T09:09:35.557 回答
0

是的 Óscar Andreu 是正确的 -'$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 处理器实例,分别用于年、月和日。看起来有点迟钝,但它确实有效。

于 2018-10-14T17:13:02.347 回答