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

How to find average of two lines in NiFi?

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

我的 CSV 文件如下所示

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


Andy,2,85
Andy,2,95

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

Table:

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

是否可以使用 NiFi 求出不同行中两个值的平均值?

鉴于 很多 的假设,这是可行的。您最好在 NiFi 中预处理数据并将其导出到更适合此的工具,例如 Apache Spark using the NiFi Spark Receiver library (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 反射))。在属性中获得所需结果后,使用 ReplaceText 更新流文件内容,并使用 MergeContent 将各个流文件合并回单个实例。

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