Apache NiFi:使用ExecuteScript处理器处理多个csv

时间:2019-11-05 08:33:25

标签: python csv apache-nifi data-cleaning

我有一个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))

我不知道如何在this question中所示的executeScript处理器中使用会话和代码。因此,我只编写了一个简单的python代码,并将有效和无效数据定向到了不同的文件。我使用的这种方法有很多限制

  1. 我希望能够动态处理具有不同文件名的csv。
  2. 发送无效数据的csv还必须具有与输入csv相同的文件名。
  3. 我的redder文件夹中大约有20个csv。所有这些都必须一次性处理。

希望您可以为我提出以下方法。随时为我提供一个解决方案,方法是编辑我使用的Python代码,甚至完全使用另一套处理器,完全不使用ExecuteScript Processer

2 个答案:

答案 0 :(得分:2)

有关how to use QueryRecord processor的完整的分步说明,

基本上,您需要设置突出显示的属性

enter image description here

答案 1 :(得分:1)

您要基于一列中的值来路由记录。在NiFi中有多种方法可以实现这一目标。我可以想到以下几点:

我向您展示了如何使用PartitionRecord处理器解决您的问题。由于您未提供任何示例数据,因此创建了一个示例用例。我想将欧洲的城市与其他城市区分开。给出以下数据:

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

流量:

enter image description here

GenerateFlowFile:

enter image description here

PartitionRecord:

enter image description here

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

每个组都是一个流文件,并且具有country属性,您可以使用该属性来路由组。

RouteOnAttribute:

enter image description here

来自欧洲的所有国家都将被路由到is_europe关系。现在,您可以将相同的策略应用于用例。