sum - mule dataweave 中的求和函数需要太多时间
问题描述
我有一个包含超过 45,000 条记录的 ArrayList。我想创建一个新列表,当列表中存在 ID 和名称值的组合时,它将包含所有值的总和。例如,下面是我的输入列表。我通过读取 xls 文件并将其存储在一个名为“myList”的变量中来创建此列表 -
[
{ID=481, name =ABCD, value=100},
{ID=481, name =ABCD, value=50},
{ID=2053, name =XYZ, value=300}
]
我的代码 -
%dw 1.0
%output application/java
%function getIdname(ID, name) (ID ++ " - " ++ name)
%function addAllValues(ID, name) sum ((flowVars.myList.Data filter (getIdname($.ID,$.name) == getIdname(ID, name))).value)
---
{
Data: flowVars.myList.Data map ((payload01 , indexOfPayload01) -> {
ID: payload01.ID,
name: payload01.name,
finaValue : addAllValues(payload01.ID, payload01.name)
})
}
输出 -
Data=[
{ID=481, name =ABCD, finalValue=150},
{ID=2053, name =XYZ, finalValue=300}
]
在这里,对于具有 5 或 10 条记录的文件,我得到了上述所需的输出。但是,如果我使用具有超过 45,000 条记录的实际文件,则执行我的代码需要花费太多时间并且它不会创建任何输出。另外,我没有任何例外。谁能建议我在这里做错了什么。为什么要花这么多时间来汇总相等的记录。我已经检查了 40 分钟,但仍然没有收到任何输出
解决方案
map
您在导致此延迟的每次迭代中过滤 45000 条记录(即您正在过滤 45000 次)。你filter/group
只需要一次。此外,您的 dataweave 不会产生您想要的输出,因为没有使用 distinctBy。
而是试试这个:
%dw 1.0
%output application/java
%var dataByIdName = flowVars.myList.Data groupBy ($.ID ++ $.name)
---
{
Data: dataByIdName map {
ID: $[0].ID,
name: $[0].name,
finalValue: sum $.*value
}
}
这不需要 distinctBy 并且您只需分组一次。
推荐阅读
- java - 方法返回 false 但条件匹配并且应该返回 true
- hazelcast - Hazelcast中IMap和ICache的区别
- javascript - 导航关闭抽屉不起作用反应导航
- python - Docker 与 TensorFlow
- vue.js - 在 TS 中的 Vue 中的单个文件组件中导出多个部分模块
- jquery - 如何将数组的所有值显示到不同的输入文本区域?
- python - 如何使用熊猫将两列中的数据合并为一个带有+号的数据
- java - 使用 KafkaListener 以 ASCII 字符串形式接收消息
- git - 将 ssh 代理套接字转发到 docker build
- java - 未在可执行 jar 中加载的依赖类