【问题标题】:Get Max value from the column in Dataweave从 Dataweave 中的列中获取最大值
【发布时间】:2021-09-23 16:33:38
【问题描述】:

输入:

number,fruit,colour,join_date,avginqty,avgoutqty,resolution
282,apple,red,today,3 qty,2 qty,640*320
282,apple,red,today,3 qty,,200*200
282,apple,red,today,1 qty,,640*320
282,banana,yellow,yesterday,,,
282,banana,yellow,yesterday,1 qty,,200*200
/283,banana,yellow,yesterday,1 qty,,200*200

输出 Json:

number,fruit,colour,join_date,avginqty,avgoutqty, resolution
282,apple,red,today,2 qty,2 qty, 640*320
282,banana,yellow,yesterday,1 qty,,200*200

我想得到以下内容:

  • 获取最常见的分辨率列数据
  • 并删除数字列中包含“/”的行

数量:


(payload groupBy (key,index) ->(key.number ++ key.join_date)) mapObject {
   a: {
       number: $[0].number,
       fruit: $[0].fruit,
       colour: $[0].colour,
       join_date:$[0].join_date,
       avginqty: if((sizeOf($.avginqty filter $ != "")) != 0) ($.avginqty sumBy (if($ == "") 0 else $))/(sizeOf($.avginqty filter $ != "")) ++ " qty" else "", 
       avgoutqty: if((sizeOf($.avgoutqty filter $ != "")) != 0) ($.avgoutqty sumBy (if($ == "") 0 else $))/(sizeOf($.avgoutqty filter $ != "")) ++ " qty" else ""
   }
} pluck $

【问题讨论】:

  • “获取最频繁的数据解析列”是什么意思?请澄清标准。目前尚不清楚预期输出如何与此标准匹配。
  • 基于数字和水果,例如282和水果苹果有2 of 640*320
  • 那么,你想按数字和水果分组,然后计算不同的分辨率,得到计数最大的组吗?您是如何选择 avgoutqty='2 qty' 而不是空的?或者它来自那个组?此外,对于 282-bananas,'' 和 '200*200' 的数量是相同的。你需要选择哪一个?
  • 对于数量是 : avginqty: if((sizeOf($.avginqty filter $ != "")) != 0) ($.avginqty sumBy (if($ == "") 0 else $))/(sizeOf($.avginqty filter $ != "")) ++ " qty" else "", avgoutqty: if((sizeOf($.avgoutqty filter $ != "")) != 0) ($.avgoutqty sumBy (if($ == "") 0 else $))/(sizeOf($.avgoutqty filter $ != "")) ++ " qty" else ""

标签: dataweave mule4


【解决方案1】:

下面的脚本可以满足您的要求,但不会比较分辨率。

输入

number,fruit,colour,join_date,avginqty,avgoutqty,resolution
282,apple,red,today,3 qty,2 qty,200*200
282,apple,red,today,3 qty,,640*320
282,apple,red,today,4 qty,,641*320
282,apple,red,today,1 qty,,640*320
282,banana,yellow,yesterday,,,
282,banana,yellow,yesterday,2 qty,,200*200
282,banana,yellow,yesterday,1 qty,,200*200
/283,banana,yellow,yesterday, qty,,200*200

脚本

%dw 2.0
output application/csv
import * from dw::core::Arrays
var countOfResolution = (payload filter (!($.number contains "/")) groupBy ($.number ++ $.fruit ++ $.resolution) mapObject {
    (($.number[0]++"_"++$.fruit[0]) :
      { 
          resolution: $.resolution[0],
          occurence:$.resolution reduce (( curVal, acc= 0 ) -> 
    acc + 1 )
      }
    ) 
} orderBy -$.occurence)

---
payload filter (!($.number contains "/")) groupBy ($.number ++ $.fruit ++ $.resolution) mapObject {

        (a: {
            number: $[0].number,
            fruit: $[0].fruit,
            colour: $[0].colour,
            join_date:$[0].join_date,
            avginqty:  (if((sizeOf($.avginqty filter $ != "")) != 0 ) ($.avginqty sumBy (if(($ splitBy " ")[0] == "") 0 else ($ splitBy " ")[0]))/(sizeOf($.avginqty filter $ != "")) ++ " qty" else ""), 
            avgoutqty: if((sizeOf($.avgoutqty filter $ != "")) != 0) ($.avgoutqty sumBy (if(($ splitBy " ")[0] == "") 0 else ($ splitBy " ")[0]))/(sizeOf($.avgoutqty filter $ != "")) ++ " qty" else "",
            resolution: $.resolution[0] 
        }) if((countOfResolution.*"$($[0].number ++"_"++ $[0].fruit)" filter $.resolution != "")[0].resolution == $.resolution[0] )
    } 
    pluck $

输出

number,fruit,colour,join_date,avginqty,avgoutqty,resolution
282,apple,red,today,2 qty,,640*320
282,banana,yellow,yesterday,1.5 qty,,200*200

脚本分解

  1. 创建一个对象来保存每个 number_fruit 组合的分辨率及其出现次数。
  2. 按降序对结果对象进行排序,以获得出现次数最多的分辨率。
  3. 在主脚本中,如果当前 分辨率等于最大对象的输出 为给定的 number_fruit 计算发生的分辨率 组合。

从这里开始尝试并根据您的需要对其进行增强。如果您对此有所不同,请务必将其作为单独的问题提出。

【讨论】:

  • 您好,如果有 2 个分辨率列怎么样?
  • 新问题.. 就像我之前提到的,你不能像你一直在做的那样,在同一个问题中不断修改你的问题!!
  • 在你的问题中也要明确,因为除了你之外,没有人知道你想要解决什么。你表达得越多,对问题的表达越清楚,其他人就越容易尝试解决问题。
  • 这是否有助于您找到解决方案?如果是这样,请务必接受它作为答案,因为它可能会帮助可能遇到类似问题的人。
  • 嗨,我刚刚意识到输出没有 avgoutqty
【解决方案2】:

您只需在脚本中添加一个过滤器即可删除斜线:​​payload filter (!($.number contains "/")

并不是说我已经从输入量中删除了" qty" 字符串,以便可以对它们求和。在同一列中混合数字和字符串对我来说没有意义。

完整脚本:

%dw 2.0
import * from dw::core::Arrays
output application/csv
---
(payload filter (!($.number contains "/"))
    groupBy (key,index) ->(key.number ++ key.join_date))

    mapObject {
        a: {
            number: $[0].number,
            fruit: $[0].fruit,
            colour: $[0].colour,
            join_date:$[0].join_date,
            avginqty: if((sizeOf($.avginqty filter $ != "")) != 0) ($.avginqty sumBy (if($ == "") 0 else $))/(sizeOf($.avginqty filter $ != "")) ++ " qty" else "", 
            avgoutqty: if((sizeOf($.avgoutqty filter $ != "")) != 0) ($.avgoutqty sumBy (if($ == "") 0 else $))/(sizeOf($.avgoutqty filter $ != "")) ++ " qty" else ""
        }
    } 
    pluck $

【讨论】:

  • 您好,谢谢,分辨率如何?根据数量和加入日期使用最频繁的数据输入
  • 对不起,我不太明白你的意思。您能否在问题中添加更多详细信息和示例?
  • 基于水果和数字分组,apple和282,200*200分辨率出现1次,640*320出现2次,因此使用次数最高的次数为2次为 640*320,因此对于 282 个数字,苹果果实分组,输出将是 640*320。如果为null(无值),则忽略此行,不考虑计算。
  • 在脚本中的 groupBy 子句中,您使用的是 number 和 join_date,而您在上面的评论中提到的是按水果和数字分组。这个用例需要考虑哪一个?水果是否也有可能具有相同计数的两种不同分辨率?例如640*320 出现 2 次,200*200 出现 2 次?
  • 嗨,对不起,我的错,错字。是的,按水果和数字分组
猜你喜欢
  • 2020-11-28
  • 2014-01-16
  • 2019-10-23
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多