在Java 8中分组在具有聚合的多个字段上
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Java 8中分组在具有聚合的多个字段上,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2391字,纯文字阅读大概需要4分钟。
内容图文
![在Java 8中分组在具有聚合的多个字段上](/upload/InfoBanner/zyjiaocheng/753/8c9331db13a84eb28de99a6576324096.jpg)
参见英文答案 > Group by multiple field names in java 8 6个
我有一个与Web访问记录相关的域对象列表.这些域对象可以扩展到数千个.
我没有资源或要求以原始格式将它们存储在数据库中,因此我希望预先计算聚合并将聚合数据放入数据库中.
我需要聚合在5分钟窗口中传输的总字节数,如下面的SQL查询
select
round(request_timestamp, '5') as window, --round timestamp to the nearest 5 minute
cdn,
isp,
http_result_code,
transaction_time,
sum(bytes_transferred)
from web_records
group by
round(request_timestamp, '5'),
cdn,
isp,
http_result_code,
transaction_time
在Java 8中,我的第一个当前刺戳看起来像这样,我知道这个解决方案类似于Group by multiple field names in java 8中的这个响应
Map<Date, Map<String, Map<String, Map<String, Map<String, Integer>>>>>>> aggregatedData =
webRecords
.stream()
.collect(Collectors.groupingBy(WebRecord::getFiveMinuteWindow,
Collectors.groupingBy(WebRecord::getCdn,
Collectors.groupingBy(WebRecord::getIsp,
Collectors.groupingBy(WebRecord::getResultCode,
Collectors.groupingBy(WebRecord::getTxnTime,
Collectors.reducing(0,
WebRecord::getReqBytes(),
Integer::sum)))))));
这很有效,但它很难看,所有嵌套的地图都是噩梦!要将地图“展平”或“展开”成行,我必须这样做
for (Date window : aggregatedData.keySet()) {
for (String cdn : aggregatedData.get(window).keySet()) {
for (String isp : aggregatedData.get(window).get(cdn).keySet()) {
for (String resultCode : aggregatedData.get(window).get(cdn).get(isp).keySet()) {
for (String txnTime : aggregatedData.get(window).get(cdn).get(isp).get(resultCode).keySet()) {
Integer bytesTransferred = aggregatedData.get(window).get(cdn).get(distId).get(isp).get(resultCode).get(txnTime);
AggregatedRow row = new AggregatedRow(window, cdn, distId...
正如您所看到的,这非常混乱且难以维护.
任何人都有更好的方法来做到这一点?任何帮助将不胜感激.
我想知道是否有更好的方法来展开嵌套的地图,或者是否有一个允许你对集合进行GROUP BY的库.
解决方法:
您应该为地图创建自定义键.最简单的方法是使用Arrays.asList:
Function<WebRecord, List<Object>> keyExtractor = wr ->
Arrays.<Object>asList(wr.getFiveMinuteWindow(), wr.getCdn(), wr.getIsp(),
wr.getResultCode(), wr.getTxnTime());
Map<List<Object>, Integer> aggregatedData = webRecords.stream().collect(
Collectors.groupingBy(keyExtractor, Collectors.summingInt(WebRecord::getReqBytes)));
在这种情况下,键是固定顺序的5个元素的列表.不是面向对象,而是简单.或者,您可以定义自己的类型,表示自定义键并创建正确的hashCode / equals实现.
内容总结
以上是互联网集市为您收集整理的在Java 8中分组在具有聚合的多个字段上全部内容,希望文章能够帮你解决在Java 8中分组在具有聚合的多个字段上所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。