使用JavaScript在NiFi中转换TimeZone

时间:2018-12-20 14:12:44

标签: apache-nifi

我们如何使用ExecuteScript处理器中的JavaScript将TimeZone从UTC转换为NiFi中的America / New_York。

更多信息:

我知道我们可以在已经实现的UpdateRecord处理器中进行操作。但是文件太大(超过20GB),并且我正在ExecuteScript处理器中进行一些预处理,所以我不想再次重复整个文件。目前,处理单个文件需要18个小时以上的时间。我认为在ExecuteScript中实现时区转换,将大大减少处理时间。

我当前所在的确切位置:

我目前无法导入和创建SimpleDateFormat之类的Java对象

我试图在NiFi中实现的Java代码(通过将其转换为JavaScript )如下:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class HelloWorld {
    public void convertDateTimeZone() throws Exception{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        TimeZone utcZone = TimeZone.getTimeZone("UTC");
        String dateInString = "1982/01/10 10:20:56";

        sdf.setTimeZone(utcZone);
        Date utcDate = sdf.parse(dateInString); // Create a new Date object

        System.out.println(sdf.format(utcDate));

        SimpleDateFormat  nysdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        TimeZone newyorkZone = TimeZone.getTimeZone("America/New_York");
        nysdf.setTimeZone(newyorkZone);

        System.out.println(nysdf.format(utcDate));
    }
}

1 个答案:

答案 0 :(得分:0)

下面的示例代码显示了如何从ExecuteScript Javascript中引用Java SimpleDateFormat类:

var flowFile = session.get();

if (flowFile !== null) {

    var StreamCallback = Java.type("org.apache.nifi.processor.io.StreamCallback");
    var IOUtils = Java.type("org.apache.commons.io.IOUtils");
    var StandardCharsets = Java.type("java.nio.charset.StandardCharsets");
    var SimpleDateFormat = Java.type("java.text.SimpleDateFormat")
    var TimeZone = Java.type("java.util.TimeZone")

    flowFile = session.write(flowFile, new StreamCallback(function(inputStream, outputStream) {

            var inputDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
            var utcZone = TimeZone.getTimeZone("UTC")
            inputDateFormat.setTimeZone(utcZone)

            var outputDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
            var outputZone = TimeZone.getTimeZone("America/New_York")
            outputDateFormat.setTimeZone(outputZone)

            var inputDateTime = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
            var utcDate = inputDateFormat.parse(inputDateTime)
            var outputDateTime = outputDateFormat.format(utcDate)
            IOUtils.write(outputDateTime, outputStream, StandardCharsets.UTF_8)
    }));

    session.transfer(flowFile, REL_SUCCESS);
}