2017-01-27 3 views
0

У меня есть данные, в которых мне нужно сравнить месяц данных, если он был в прошлом месяце, тогда его следует вставить иначе.Как вставить предыдущий месяц данных в базу данных Nifi?

Пример:

23.12.2016 12:02:23,Koji,24 
22.01.2016 01:21:22,Mahi,24 

Теперь мне нужно, чтобы получить первый столбец данных (23.12.2016 12:02:23), а затем получить месяц (12) на нем.

По сравнению с до того, что текущего месяца, как.,

If current month is 'JAN_2017',then get before of 'JAN_2017' it should be 'Dec_2016' 

В первой строке,

сравнить это '' Dec_2016 [месяц до] с месяца данных '' Dec_2016 [23.12.2016 ].

Он сопоставляется, а затем вводится в базу данных.

EDIT 1:

я уже пытались с вашими предложениями.

"UpdateAttribute to add a new attribute with the previous month value, and then RouteOnAttribute to determine if the flowfile should be inserted " 

я использовал ниже языка выражений в RouteOnAttribute,

${literal('Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'):getDelimitedField(${csv.1:toDate('dd.MM.yyyy hh:mm:ss'):format('MM')}):equals(${literal('Dec,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov'):getDelimitedField(${now():toDate(' Z MM dd HH:mm:ss.SSS yyyy'):format('MM'):toNumber()})})} 

это может быть неисправно в данных ниже.,

23.12.2015,Andy,21 
23.12.2017,Present,32 

Мои данные могут содержит некоторые прошлые годы и последующие годы

Это совпадает с моим выражением, которое оно также вставлено.

Мне нужно проверить месяц за годом в данных.

Как я могу проверить его?

ответ

2

Самый простой ответ - использовать процессор ExecuteScript с простой логикой даты (это позволит использовать структуру данных Groovy/Java для правильной обработки таких вещей, как високосные годы, часовые пояса и т. Д.).

Если вы действительно этого не хотите, возможно, вы можете использовать регулярное выражение и язык выражений в UpdateAttribute, чтобы добавить новый атрибут с предыдущим значением месяца, а затем RouteOnAttribute, чтобы определить, должен ли файл потока быть вставлен в база данных.

Вот простой тест Groovy, демонстрирующий логику. Вам необходимо будет добавить код для обработки сеанса, файла потока и т. Д.

@Test 
public void textScriptShouldFindPreviousMonth() throws Exception { 
    // Arrange 
    def input = ["23.12.2016 12:02:23,Koji,24", "22.01.2016 01:21:22,Mahi,24"] 
    def EXPECTED = ["NOV_2016", "DEC_2015"] 

    // Act 
    input.eachWithIndex { String data, int i -> 
     Calendar calendar = Date.parse("dd.MM.yyyy", data.tokenize(" ")[0]).toCalendar() 
     calendar.add(Calendar.MONTH, -1) 
     String result = calendar.format("MMM_yyyy").toUpperCase() 

     // Assert 
     assert result == EXPECTED[i] 
    } 
} 
Смежные вопросы