如何使用Apache Nifi加入两个CSV

时间:2017-03-20 16:22:45

标签: etl apache-nifi

我正在研究ETL工具(如Talend)并调查是否可以使用Apache Nifi。 Nifi可用于执行以下操作:

  1. 选取两个放在本地磁盘上的CSV文件
  2. 将CSV加入公共列
  3. 将已加入的CSV写入磁盘
  4. 我已尝试在Nifi中设置工作,但无法查看如何执行两个单独的CSV文件的连接。这个任务在Apache Nifi中是否可行?

    看起来QueryDNS processor可以用来使用另一个来丰富一个CSV文件,但这个用例似乎过于复杂。

    以下是输入CSV的示例,需要在state_id上​​加入:

    输入文件

    customers.csv

    id | name | address      | state_id
    ---|------|--------------|---------
    1  | John | 10 Blue Lane | 100
    2  | Bob  | 15 Green St. | 200
    

    states.csv

    state_id | state
    ---------|---------
    100      | Alabama
    200      | New York
    

    输出文件

    output.csv

    id | name | address      | state
    ---|------|--------------|---------
    1  | John | 10 Blue Lane | Alabama
    2  | Bob  | 15 Green St. | New York
    

3 个答案:

答案 0 :(得分:9)

Apache NiFi更像是一种数据流工具,并不是真正用于执行流数据的任意连接。通常,这些类型的操作更适合流式处理系统,如Storm,Flink,Apex等,或ETL工具。

NiFi可以很好地进行连接的类型是具有固定大小的查找数据集的丰富查找,并且对于传入数据中的每个记录,您使用查找数据集来检索某些值。例如,在你的情况下,可能有一个名为LookUpState的处理器,它有一个属性“State Data”,它指向一个包含所有状态的文件,那么customers.csv就可以作为这个处理器的输入。

社区成员启动了一个项目,为NiFi制作通用查找服务: https://github.com/jfrazee/nifi-lookup-service

答案 1 :(得分:4)

此后的典型模式是将参考集加载到NiFi中的地图缓存控制器服务中。在这种情况下,这是states.csv数据。然后,客户数据的实时馈送进入,并使用ReplaceText等内容丰富了此参考数据,或者您甚至可以在Groovy中编写自定义处理器。有很多方法可以解决这个问题。还有一个JIRA/PR即将变得更容易。实时流连接的元素最好在Apache Storm,Spark和Flink等处理系统中完成,但对于你提到的情况,可以在NiFi中很好地完成。

答案 2 :(得分:1)

workflow

我还尝试使用common列连接两个CSV文件,并使用nifi lookup record config

中的lookup record属性成功完成了此操作

在这里,我使用simplecsvlookup服务作为查找服务,并且还附加了它的配置simplecsvlookup configuration

我们应该学习的第一件事是如何使用查找记录属性。在这里,我有两个csv文件:

sample.csv : id,msisdn,充值金额 1,9048108594,399

新1 : 类型 9048108594,1

输出: id,msisdn,充值金额,类型 1,9048108594,399,1

最重要的是要注意结果记录的路径和键 在这种情况下,密钥为 msisdn (因为这是两个文件中的通用密钥) 并且,对于结果记录路径,我们应该使用需要与我们合并的列名,在本例中为“ type:”

result record path--->> /type
key----->> /msisdn

然后,在查找服务中,给出各自的键和值名称。

它将起作用。