2017-02-21 78 views
1

我需要在不同的行中找到两个值的平均值。如何在NiFi中查找两条线的平均值?

我的CSV文件看起来像这样

Name,ID,Marks 
Mahi,1,90 
Mahi,1,100 


Andy,2,85 
Andy,2,95 

现在我需要的是平均2马克存储在数据库中。 “平均”一栏应增加两个商标并2和商店,导致SQL查询划分

表:

Name,ID,Average 
Mahi,2,95 
Andy,2,90 

是否可以找到采用NiFi在单独的行中的两个值的平均值?

回答

3

给定很多的假设,这是可行的。您最好在NiFi中预处理数据并将其导出到更适合此工具的工具,如使用NiFi Spark Receiver库(instructions here)的Apache Spark,因为此解决方案不能很好地扩展。

但是,你当然可以使用SplitText处理器的组合,以获得正确的数据到个人flowfiles(即所有马希行于一体,所有安迪排在其他)。一旦你有一个纪录,看起来像:

Andy,1,85 
Andy,1,95 

可以使用ExtractText使用正则表达式得到8595到属性marks.1marks.2(哪里比例将打破一个很好的例子 - 2行这样做很容易;用100k做这件事很荒谬)。然后可以使用表达式语言UpdateAttribute来计算这两个属性的平均值(首先转换toNumber())并填充第三个属性marks.average(通过链接plus()divide()函数或math advanced operation(使用Java反射))。一旦在属性中具有所需的结果,请使用ReplaceText更新流文件内容,并使用MergeContent将各个流文件合并回单个实例。

如果这是我,我首先会评估输入数据格式的静态方式,如果它保证保持不变,可能只需编写一个Groovy脚本来分析数据并计算出平均值。我认为,由于具有编写特定领域的代码的灵活性,它甚至可以更好地扩展(在合理的范围内)。如果您需要将其卸载到群集操作中,Spark就是要走的路。