如何将上个月的数据插入数据库Nifi?

时间:2017-01-27 04:44:40

标签: apache-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]进行比较。

匹配然后插入数据库。

编辑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

我的数据可能包含过去几年和未来几年

它与我的表达式匹配,也插入了。

我需要在数据中检查一年中的月份。

我该如何检查?

1 个答案:

答案 0 :(得分: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]
    }
}