ule数据编织中的求和函数需要太多时间

时间:2019-05-05 09:43:08

标签: sum mule dataweave

我有一个ArrayList,其中包含超过45,000条记录。我想创建一个新列表,当ID和Name值组合出现在列表中时,它将包含所有值的总和。例如以下是我的输入列表。我通过读取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分钟,但仍然没有收到任何输出

1 个答案:

答案 0 :(得分:3)

您正在map的每次迭代中过滤45000条记录,这导致了此延迟(即,您过滤了45000次)。您只需filter/group一次。另外,由于未使用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,而且您只需分组一次。