@Test
public void testAggregation() {
List<Map<String, Object>> joinedList = new ArrayList<>();
Map<String, Object> Myrecord = new HashMap<> ();
Map<String, Object> Myrecord2 = new HashMap<> ();
Map<String, Object> Myrecord3 = new HashMap<> ();
Myrecord.put("ad_id", 8710);
Myrecord.put("medium_type", 2);
Myrecord.put("impressions", 36);
joinedList.add(Myrecord);
Myrecord2.put("ad_id", 8710);
Myrecord2.put("medium_type", 2);
Myrecord2.put("impressions", 1034);
joinedList.add(Myrecord2);
Myrecord3.put("ad_id", 9000);
Myrecord3.put("medium_type", 2);
Myrecord3.put("impressions", 10);
joinedList.add(Myrecord3);
System.out.println("Myrecord:" + joinedList);
//joinedList: [{ad_id=8710, impressions=36, medium_type=2}, {ad_id=8710, impressions=1034, medium_type=2}, {ad_id=9000, impressions=10, medium_type=2}]
}我有一个用例,其中我需要从两个表中提取相同的模式集,并聚合这两个表中的数据。我的想法是分别查询表,并将它们保存在List>中,然后合并它们。一旦我合并它们-示例输出如下所示
//joinedList: [{ad_id=8710, medium_type=2, impressions=36}, {ad_id=8710, medium_type=2, impressions=1034}, {ad_id=9000, medium_type=2, impressions=10}]我想对维度(ad_id和medium_type,它们可以是动态的,随用户输入而变化)执行分组操作,并聚合指标(它们也是动态的,随用户输入而变化)。在该示例中,对上面示例中的ad_id和medium_type使用groupby,并聚合指标印象,最终结果应如下所示
//final output: [{ad_id=8710, medium_type=2, impressions=1070}, {ad_id=9000, medium_type=2,
impressions=10}]注意: group by字段(上面的ad_id、medium_type )可以是动态的,并且由用户输入的内容驱动。它们可以是除ad_id、medium_type之外的任何东西。同样,指标也是如此,用户可能对印象、点击、metric3、metric4感兴趣。
发布于 2019-12-12 12:20:07
因为这不适合在评论中使用。我相信你的实际问题是在定义要执行的操作时寻找动态性。但正如评论中指出的,这将需要一些决定性的操作集来决定一种方法。
例如,使用当前的描述,您可以在以下行执行某些操作(请注意,注释可能会突出显示您正在询问的实际问题):
@AllArgsConstructor
static class Record {
Integer adId;
Integer mediumType;
Long impressions;
// note these are identity only for sum operation
static Record identity() {
return new Record(0, 0, 0L);
}
static Function<Record, List<Object>> classifierToGroupBy() {
return r -> Arrays.asList(r.adId, r.mediumType); // make this dynamic
}
static BinaryOperator<Record> mergeOperationInDownstream() {
return (a, b) -> new Record(a.adId, a.mediumType,
a.impressions + b.impressions); //dynamic field and operation selection
}
}
public List<Record> processData(List<Record> records) {
return new ArrayList<>(records.stream()
.collect(Collectors.groupingBy(Record.classifierToGroupBy(),
Collectors.reducing(Record.identity(), Record.mergeOperationInDownstream())))
.values());
}https://stackoverflow.com/questions/59295011
复制相似问题