尝试合并两个以csv格式输入的流文件,并基于某个公共标头值准备合并的csv输出和来自两个输出的数据。
需要基于“ creation_Date”和“ Hour_of_Day”联接行,并合并两个流文件,并具有“ source_count”和“ hive_count”之间的计算出的差异。如果INPUT_2缺少某个INPUT_1具有的creation_date / Hour_of_day,则我也需要将其包含在内 ,并且在“差异”标头下可能有“无可用”字样。
如何在Nifi中实现这一目标?有什么方法可以使用MergeContent加入并在输出文件上运行查询以生成差异?
任何帮助将不胜感激。 :)
SOURCE_INPUT_1
creation_Date,Hour_of_day,source_count
2018-08-16,3,19934
2018-08-16,0,3278
2018-08-16,1,10680
2018-08-16,4,19705
2018-08-16,2,14199
2018-08-16,5,672
SOURCE_INPUT_2
creation_date,hour_of_day,hive_count
2018-08-16,0,3279
2018-08-16,1,10680
2018-08-16,3,19933
2018-08-16,2,14199
2018-08-16,4,19700
组合输出
creation_Date,hour_of_day,source_count,hive_count,difference
2018-08-16,0,3278,3279,-1
2018-08-16,1,10680,10680,0
2018-08-16,2,14199,14199,0
2018-08-16,3,19934,19933,1
2018-08-16,4,19705,19700,5
2018-08-16,5,672,0,(NotAvailable)
答案 0 :(得分:3)
Apache NiFi通常不执行此类流连接。
它可以执行的联接更多是查找联接,其中数据的一侧是固定的,另一侧是来自传入流。查找服务的工作方式如此,我相信这里有CSV查找服务。
另一种选择是将数据插入数据库,然后使用ExecuteSQL发出SQL查询,将它们连接在一起并将结果写到单个流文件中。
最后,您可以使用所有具有真正流连接的流处理系统,例如Spark,Flink,Storm等。
MergeContent用于将“喜欢”的数据合并在一起,因此,如果所有数据都是具有相同列的CSV,并且您使用该数据创建了多个流文件,则可以将它们全部合并为一个大CSV。
答案 1 :(得分:-1)
@StrangerThinks这种方法可能有帮助
使用QueryRecord处理器合并记录并在其中产生具有不同属性的行:
select fa.t, fa.v a, fb.v b, fc.v c
from (
select t, v from FLOWFILE where m = 'a'
) fa
left join (
select t, v from FLOWFILE where m = 'b'
) fb on fa.t = fb.t
left join (
select t, v from FLOWFILE where m = 'c'
) fc on fa.t = fc.t
查看更多信息 https://gist.github.com/ijokarumawak/7e20af1cd222fb2adf13acb2b0f46aed