select a , count(distinct b) cn from t
如果统计是死的或者实时性要求没这么高,那么可以用各种手段做缓存。
如果统计是实时的并且数据量不大,几十万的数据量
Stream API一行式(Java 8+)
css
Map<String, Long> result = dataList.stream()
.collect(Collectors.groupingBy(
Vo::getA,
Collectors.mapping(
Vo::getB,
Collectors.collectingAndThen(
Collectors.toSet(),
Set::size
)
)
));
并行处理版(大数据量)
css
Map<String, Integer> result = dataList.parallelStream()
.collect(
Collectors.groupingByConcurrent(
Vo::getA,
Collectors.mapping(
Vo::getB,
Collectors.toSet()
)
)
)
.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().size()
));
如果要求实时统计数据量又很大,几千万甚至过亿数据量, 上 Elasticsearch
如果要求实时统计数据量更大,过亿甚至接近无限,上Flink