【问题标题】:Apache Nifi: Merge rows in two csv filesApache Nifi:合并两个 csv 文件中的行
【发布时间】:2020-03-22 17:01:19
【问题描述】:

我有两个 csv 文件汇集到 MergeContent 处理器中。我希望它们合并在一起。它们都有相同的列。如果第一个和第二个 csv 看起来像这样:

第一个 CSV:

id, name
12,John
11,Keels

第二个 CSV:

id, name
22,Kelly
25,Felder

我的输出应该如下所示:

id, name
12,John
11,Keels
22,Kelly
25,Felder

我已尝试通过MergeContent 处理器执行此操作。但它将数据更改为不同的格式我不希望这种情况发生。输入文件和输出文件都必须是 .csv,并且还包含与输入文件相同的名称。 (输入文件同名)

【问题讨论】:

    标签: csv merge apache-nifi


    【解决方案1】:

    使用具有公共属性的MergeRecord 处理器。例如,两个流文件具有相同的属性如filename = test.csv,那么您可以设置MergeRecord处理器如下:

    Record Reader                      CSVReader
    Record Writer                      CSVRecordSetWriter
    Merge Strategy                     Bin-Packing Algorithm
    Correlation Attribute Name         filename
    Attribute Strategy                 Keep Only Common Attributes
    Minimum Number of Records          3
    

    重要的是最小记录数,也就是要合并的行数。在这种情况下,它应该大于 2,因为每个 CSV 有 2 行。然后,CSV 将等待另一个 CSV 超过最小值。

    【讨论】:

    • 我收到一条错误消息,提示已存在同名文件名。尝试使用putfile 处理器时。
    • 如果您输入了多个文件,那么您必须指定不应重复的文件名。这不是合并的问题,而是您对文件名的定义。您可以使用一些时间格式指定文件名属性,例如${filename:append(${now():format("yyyy-MM-dd_HH:mm:ss", "GMT")}):append('.csv')}
    • 我有一个 csv 文件,我将其分成两个流文件并独立处理。我将这两个文件发送到mergeRecord 处理器。因此它们都具有相同的文件名。我很困惑为什么它说有一个同名的文件。因为最后应该是一个文件。
    • 哦,我明白了。为什么不选择相关属性名称作为文件名?并且由于您从文件中拆分记录,因此最好使用defragment 策略。
    • correlation Attribute Name 到底是什么?此外,当我从 merge record 处理器更改为 defragment 时出现错误,说 ` 无法将 bin 与 1 个流文件合并,因为任何流文件上都不存在 fragment.count 属性`
    猜你喜欢
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多