首页 > 解决方案 > 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 分钟,但仍然没有收到任何输出

标签: summuledataweave

解决方案


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 并且您只需分组一次。


推荐阅读