我需要在不同的行中找到两个值的平均值。
我的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在单独的行中找到两个值的平均值?
答案 0 :(得分:3)
鉴于假设的批次,这是可行的。你最好不要在NiFi中预处理数据并将其导出到更适合这种情况的工具,例如Apache Spark使用NiFi Spark Receiver库(instructions here),因为这个解决方案不会规模很好。
但是,您当然可以使用SplitText
处理器的组合将正确的数据导入单个流文件(即所有 Mahi 行中的所有 Andy 另一行)。一旦你有一个看起来像的记录:
Andy,1,85
Andy,1,95
您可以将ExtractText
与正则表达式结合使用,将85
和95
转换为属性marks.1
和marks.2
(缩放失败的一个很好的例子) - 用2行做这个很容易;用100k做这个很荒谬)。然后,您可以使用UpdateAttribute
与表达式语言一起计算这两个属性的平均值(首先转换toNumber()
)并填充第三个属性marks.average
(通过链接plus()
和divide()
函数或math
advanced operation(使用Java Reflection))。在属性中获得所需结果后,使用ReplaceText
更新流文件内容,并使用MergeContent
将各个流文件合并回单个实例。
如果这是我,我首先评估我的传入数据格式是如何静态的,如果保证保持不变,可能只需编写一个Groovy脚本来解析数据并计算平均值。我认为,由于具有编写特定于域的代码的灵活性,甚至可以更好地扩展(在合理范围内)。如果您需要将其卸载到集群操作,Spark就是您的选择。