如何在NiFi中找到两条线的平均值?

时间:2017-02-21 13:19:37

标签: apache-nifi

我需要在不同的行中找到两个值的平均值。

我的CSV文件看起来像这样

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


Andy,2,85
Andy,2,95

现在我需要在数据库中存储2个标记的平均值。 “Average”列应添加两个标记并除以2,并将结果存储在SQL查询

表:

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

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

1 个答案:

答案 0 :(得分:3)

鉴于假设的批次,这是可行的。你最好不要在NiFi中预处理数据并将其导出到更适合这种情况的工具,例如Apache Spark使用NiFi Spark Receiver库(instructions here),因为这个解决方案不会规模很好。

但是,您当然可以使用SplitText处理器的组合将正确的数据导入单个流文件(即所有 Mahi 行中的所有 Andy 另一行)。一旦你有一个看起来像的记录:

Andy,1,85
Andy,1,95

您可以将ExtractText与正则表达式结合使用,将8595转换为属性marks.1marks.2(缩放失败的一个很好的例子) - 用2行做这个很容易;用100k做这个很荒谬)。然后,您可以使用UpdateAttribute与表达式语言一起计算这两个属性的平均值(首先转换toNumber())并填充第三个属性marks.average(通过链接plus()divide()函数或math advanced operation(使用Java Reflection))。在属性中获得所需结果后,使用ReplaceText更新流文件内容,并使用MergeContent将各个流文件合并回单个实例。

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