Nifi在特定的通用标头上加入两个CSV流文件

时间:2018-08-23 14:50:05

标签: hadoop apache-nifi hortonworks-data-platform

尝试合并两个以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)

2 个答案:

答案 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