Apache Nifi 1.7 Заменить текстовый процессор для манипуляции с отметкой времени - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь использовать процессор 'Replace Text' 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 голосов
/ 14 октября 2018

Да Ó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 по одному на год, месяц и день соответственно.Кажется немного тупым, но это работает.

0 голосов
/ 26 сентября 2018

Кажется, что $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')}"
...