在NiFi中将两个JSON流文件合并在一起

时间:2018-09-02 13:31:03

标签: apache-nifi

我想通过相同的指定属性合并两个包含JSON对象的流文件...

流1:

attribute:    
xuuid = 123456

content:
{
"sname":"jack",
"id":"00001",
"state":"NY"
}

流程2:

attribute:    
xuuid = 123456

content:
{
"country":"US",
"date":"1983"
}

我希望这种形式的数据可以在单个输出流中显示:

所需流:

attribute:    
xuuid = 123456

content:
{
"sname":"jack",
"id":"00001",
"state":"NY",
"country":"US",
"date":"1983"
}

我该怎么玩? MergeContent处理器还是MergeRecord? 我认为mergerecord可以处理它,但是我对此感到困惑。

3 个答案:

答案 0 :(得分:3)

您要的是流式连接,这不是NiFi真正做的,类似的问答在这里:

https://stackoverflow.com/a/42909221/5650316

使合并处理器一个接一个地合并数据片段,而不执行流连接。例如,如果您有许多小json消息,则在写入HDFS之前希望使用MergeContent或MergeRecord将数千个json消息合并到一个流文件中。

答案 1 :(得分:2)

是的,MergeContent可以为您做到这一点。

我使用 EvalJson -> MergeContent -> AttributesToJson

我在这里发布了一个模板,您可以使用它来玩耍。 Apache NiFi Merge Json Template

MergeContent 必须具有以下设置:“保留所有属性”,“ 2个整数”,“分隔符策略是文本”

答案 2 :(得分:0)

An answer to another question 展示了如何使用 MergeContent 后跟 JoltTransformJSON 来实现这一点。

就像这里的 OP 一样,我想合并一个特定的属性(在我的例子中是 filename),所以我的 MergeContent 配置稍微不同:

Merge Strategy: Bin-Packing Algorithm
Merge Format: Binary Concatenation
Correlation Attribute Name: filename  # or xuuid, or whatever you want
Minimum Number of Entries: 2
Delimiter Strategy: Text
Header: [
Footer: ]
Demarcator: ,

之后,解决方案的第二部分是相同的:

<块引用>

然后转移到 JoltTrasnformJSON 并将 Jolt Transformation DSL 设置为 Shift 并将 Jolt Specification 设置为:

{
  "*": {
    "*": "&"
  }
}

这应该可以完成工作:)

粉碎解决方案,向@Ben Yaakobi致敬。

我唯一可以补充的是,@Bryan Bendeanswer 在技术上是正确的,即 NiFi 不是为这种事情设计的。因此,上面的答案有点像黑客:

  • 在第一部分中,MergeContent 实际上完全忽略了我们正在使用 JSON 的事实(它的 Binary Concatenation 意味着它只是将内容作为原始字节处理)。它只是通过使用 Header、Footer 和 Decmarcator 设置“伪造”将两条记录合并为一个 JSON 数组,如图所示,发生是 JSON 语法。
  • 然后在第二部分中,Jolt 能够将经过处理的文本解析为有效的 JSON,并应用其转换魔法。

为了更好地理解所使用的 Jolt 语法,以下是有关该主题的一些有用资源:

另见some alternative approaches mentioned here。特别是,我认为使用带有相关属性或碎片整理模式的使用 MergeRecord / MergeContent 的方法,然后是 QueryRecordCOALESCEGROUP BY 的顺序将两个数据集中的列连接在一起,与这个问题最相关(尽管我自己没有尝试过)。