如何在Nifi处理器中获取整个流文件内容

时间:2018-08-26 03:34:29

标签: apache-nifi

我正在使用nifi进行数据漂移。在我的流程中使用SelectHiveQL处理器。 selectHiveQL的输出(flowFile)需要带入下一个处理器。 将flowFile内容存储到用户定义变量中的合适处理器是什么,必须使用Executescript中的相同变量来处理数据。

2 个答案:

答案 0 :(得分:3)

ExecuteScript处理器可以通过标准API直接访问传入流文件的内容。这是一个示例:

def flowFile = session.get();
if (flowFile == null) {
    return;
}

// This uses a closure acting as a StreamCallback to do the writing of the new content to the flowfile
flowFile = session.write(flowFile,
        { inputStream, outputStream ->
            String line

            // This code creates a buffered reader over the existing flowfile input
            final BufferedReader inReader = new BufferedReader(new InputStreamReader(inputStream, 'UTF-8'))

            // For each line, write the reversed line to the output
            while (line = inReader.readLine()) {
                outputStream.write("${line.reverse()}\n".getBytes('UTF-8'))
            }
        } as StreamCallback)

flowFile = session?.putAttribute(flowFile, "reversed_lines", "true")
session.transfer(flowFile, /*ExecuteScript.*/ REL_SUCCESS)

将流文件内容移动到属性是危险的,因为在NiFi中对属性和内容内存的管理不同。 Apache NiFi In Depth指南中有更详细的解释。

答案 1 :(得分:1)

您可以使用ExtractText将流文件的内容提取到属性。

在ExtractText处理器中,您将创建一个属性(赋予该属性的名称将是流文件中的新属性),并且该属性的值将为正则表达式(\A.+\Z)。以我的经验,此正则表达式足以捕获流文件的全部内容,尽管我认为里程可能会根据流文件中内容的类型而有所不同。