簡體   English   中英

Apache NiFi:使用 ExecuteScript 處理器處理多個 csv

[英]Apache NiFi: Processing multiple csv's using the ExecuteScript Processor

我有一個 70 列的 csv。 第 60 列包含一個值,該值決定記錄是valid還是invalid 如果第 60 列有 0、1、6 或 7,則它是valid的。 如果它包含任何其他值,那么它是invalid的。

我意識到這個功能不可能完全依賴於改變 Apache NiFi 中處理器的屬性。 因此,我決定使用executeScript processor並將這個 python 代碼添加為文本正文。

import csv

valid =0
invalid =0
total =0
file2 = open("invalid.csv","w")
file1 = open("valid.csv","w")

with  open('/Users/himsaragallage/Desktop/redder/Regexo_2019101812750.dat.csv') as f:
    r = csv.reader(f)
    for row in f:
        # print row[1]
        total +=1

        if row[59] == "0" or row[59] == "1" or row[59] == "6" or row[59] == "7":
            valid +=1
            file1.write(row)
        else:
            invalid += 1
            file2.write(row)
file1.close()
file2.close()
print("Total : " + str(total))
print("Valid : " + str(valid))
print("Invalid : " + str(invalid))

我不知道如何使用 session 和 executeScript 處理器中的代碼,如本問題所示。 所以我只是寫了一個簡單的 python 代碼,並將有效和無效的數據指向不同的文件。 我使用的這種方法有很多局限性

  1. 我希望能夠動態處理具有不同文件名的 csv。
  2. 發送無效數據的 csv 也必須與輸入 csv 具有相同的文件名。
  3. 我的redder文件夾中將有大約 20 個 csv。 所有這些都必須在一個 go 中處理。

希望您能建議我執行以下操作的方法。 隨時通過編輯我使用的 python 代碼為我提供解決方案,甚至完全使用一組不同的處理器,並且完全不使用ExecuteScript Processer處理器

這是有關如何使用QueryRecord處理器的完整分步說明

基本上,您需要設置突出顯示的屬性

在此處輸入圖像描述

您希望根據一列中的值路由記錄。 在 NiFi 中有多種方法可以實現這一點。 我可以想到以下幾點:

我將向您展示如何使用PartitionRecord處理器解決您的問題。 由於您沒有提供任何示例數據,我創建了一個示例用例。 我想將歐洲的城市與其他地方的城市區分開來。 給出以下數據:

id,city,country
1,Berlin,Germany
2,Paris,France
3,New York,USA
4,Frankfurt,Germany

流動:

在此處輸入圖像描述

生成流文件:

在此處輸入圖像描述

分區記錄:

在此處輸入圖像描述

應該設置CSVReader來推斷模式和CSVRecordSetWriter來繼承模式。 PartitionRecord將按國家對記錄進行分組,並將它們與具有國家值的屬性country一起傳遞。 您將看到以下記錄組:

id,city,country
1,Berlin,Germany
4,Frankfurt,Germany

id,city,country
2,Paris,France

id,city,country
3,New York,USA

每個組都是一個流文件,並且將具有國家屬性,您將使用該屬性來路由組。

RouteOn屬性:

在此處輸入圖像描述

來自歐洲的所有國家都將被路由到 is_europe 關系。 現在您可以將相同的策略應用於您的用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM