DataWeave 中的分组和平均平面数据
Group By and Average Flat Data in DataWeave
输入:
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2 qty
282,apple,red,today,3 qty,
282,banana,yellow,yesterday,,
282,banana,yellow,yesterday,1 qty,
输出:
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2 qty
282,banana,yellow,yesterday,1 qty,
尝试次数:
但出现此错误:无法将对象强制转换为字符串
(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: sum($.avginqty)/sizeOf($.avginqty),
avgoutqty: sum($.avgoutqty)/sizeOf($.avgoutqty)
}
}
有以下输入
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3,2
282,apple,red,today,3,
282,banana,yellow,yesterday,,
282,banana,yellow,yesterday,1,
并使用以下 脚本
%dw 2.0
output application/csv
import * from dw::core::Arrays
---
(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: ($.avginqty sumBy (if($ == "") 0 else $))/sizeOf($.avginqty) ++ " qty",
avgoutqty: ($.avgoutqty sumBy (if($ == "") 0 else $))/sizeOf($.avgoutqty) ++ " qty"
}
} pluck $
你会得到输出
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,1 qty
282,banana,yellow,yesterday,0.5 qty,0 qty
在你之前的一个问题中(我用 4 个变体回答了这个问题(其中一个场景确实解决了你的最后一个问题(如果输入有 qty 字符串作为数量的一部分))。但是你可以使用正在关注
输入
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2 qty
282,apple,red,today,3 qty,3 qty
282,banana,yellow,yesterday,2 qty,2 qty
282,banana,yellow,yesterday,1 qty,1 qty
脚本
%dw 2.0
output application/csv
import * from dw::core::Arrays
---
(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: ($.avginqty sumBy (if(($ splitBy " ")[0] == "") 0 else ($ splitBy " ")[0] as Number ))/sizeOf($.avginqty) ++ " qty",
avgoutqty: ($.avgoutqty sumBy (if(($ splitBy " ")[0] == "") 0 else ($ splitBy " ")[0] as Number))/sizeOf($.avgoutqty) ++ " qty"
}
} pluck $
输出
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2.5 qty
282,banana,yellow,yesterday,1.5 qty,1.5 qty
以防您希望跳过数量为“”的行来进行平均计算。虽然这可能会导致在边缘情况下出现被零除错误,其中所有行都具有这些数量之一,如“”
avginqty: ($.avginqty sumBy (if($ == "") 0 else $))/(sizeOf($.avginqty filter $ != "")) ++ " qty",
avgoutqty: ($.avgoutqty sumBy (if($ == "") 0 else $))/(sizeOf($.avgoutqty filter $ != "")) ++ " qty"
避免 DBZ 错误
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 ""
配置不同输入的屏幕截图。 (所有值)
输入:
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2 qty
282,apple,red,today,3 qty,
282,banana,yellow,yesterday,,
282,banana,yellow,yesterday,1 qty,
输出:
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2 qty
282,banana,yellow,yesterday,1 qty,
尝试次数: 但出现此错误:无法将对象强制转换为字符串
(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: sum($.avginqty)/sizeOf($.avginqty),
avgoutqty: sum($.avgoutqty)/sizeOf($.avgoutqty)
}
}
有以下输入
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3,2
282,apple,red,today,3,
282,banana,yellow,yesterday,,
282,banana,yellow,yesterday,1,
并使用以下 脚本
%dw 2.0
output application/csv
import * from dw::core::Arrays
---
(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: ($.avginqty sumBy (if($ == "") 0 else $))/sizeOf($.avginqty) ++ " qty",
avgoutqty: ($.avgoutqty sumBy (if($ == "") 0 else $))/sizeOf($.avgoutqty) ++ " qty"
}
} pluck $
你会得到输出
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,1 qty
282,banana,yellow,yesterday,0.5 qty,0 qty
在你之前的一个问题中(我用 4 个变体回答了这个问题(其中一个场景确实解决了你的最后一个问题(如果输入有 qty 字符串作为数量的一部分))。但是你可以使用正在关注
输入
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2 qty
282,apple,red,today,3 qty,3 qty
282,banana,yellow,yesterday,2 qty,2 qty
282,banana,yellow,yesterday,1 qty,1 qty
脚本
%dw 2.0
output application/csv
import * from dw::core::Arrays
---
(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: ($.avginqty sumBy (if(($ splitBy " ")[0] == "") 0 else ($ splitBy " ")[0] as Number ))/sizeOf($.avginqty) ++ " qty",
avgoutqty: ($.avgoutqty sumBy (if(($ splitBy " ")[0] == "") 0 else ($ splitBy " ")[0] as Number))/sizeOf($.avgoutqty) ++ " qty"
}
} pluck $
输出
number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2.5 qty
282,banana,yellow,yesterday,1.5 qty,1.5 qty
以防您希望跳过数量为“”的行来进行平均计算。虽然这可能会导致在边缘情况下出现被零除错误,其中所有行都具有这些数量之一,如“”
avginqty: ($.avginqty sumBy (if($ == "") 0 else $))/(sizeOf($.avginqty filter $ != "")) ++ " qty",
avgoutqty: ($.avgoutqty sumBy (if($ == "") 0 else $))/(sizeOf($.avgoutqty filter $ != "")) ++ " qty"
避免 DBZ 错误
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 ""
配置不同输入的屏幕截图。 (所有值)