Конвертировать TimeZone в NiFi используя JavaScript - PullRequest
0 голосов
/ 20 декабря 2018

Как преобразовать TimeZone из, скажем, UTC в Америку / New_York в NiFi с использованием JavaScript в процессоре ExecuteScript.

Дополнительная информация:

Я знаю, что мы можем это сделатьв процессоре UpdateRecord, который я уже достиг.Но файл слишком большой (20 ГБ +), и я делаю некоторую предварительную обработку в процессоре ExecuteScript, я не хочу повторять весь файл заново.В настоящее время обработка одного файла занимает более 18 часов.Реализация преобразования часового пояса в ExecuteScript, я думаю, значительно сократит время обработки.

Точная точка, в которой я сейчас нахожусь:

В настоящее время я не могу импортировать исоздавать объекты Java, такие как SimpleDateFormat

Код Java, который я пытаюсь реализовать в NiFi ( путем преобразования его в 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 голосов
/ 23 декабря 2018

Пример кода ниже показывает, как вы можете ссылаться на класс Java SimpleDateFormat из JavaScript-кода ExecuteScript:

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);
}
...