我想通过相同的指定属性合并两个包含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可以处理它,但是我对此感到困惑。
答案 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 Bende 的 answer 在技术上是正确的,即 NiFi 不是为这种事情设计的。因此,上面的答案有点像黑客:
MergeContent
实际上完全忽略了我们正在使用 JSON 的事实(它的 Binary Concatenation
意味着它只是将内容作为原始字节处理)。它只是通过使用 Header、Footer 和 Decmarcator 设置“伪造”将两条记录合并为一个 JSON 数组,如图所示,发生是 JSON 语法。为了更好地理解所使用的 Jolt 语法,以下是有关该主题的一些有用资源:
另见some alternative approaches mentioned here。特别是,我认为使用带有相关属性或碎片整理模式的使用 MergeRecord
/ MergeContent
的方法,然后是 QueryRecord
与 COALESCE
和 GROUP BY
的顺序将两个数据集中的列连接在一起,与这个问题最相关(尽管我自己没有尝试过)。