gpt4 book ai didi

scala - 在 Java/Scala 的内存 olap/数据透视表中是否有数据结构/库要做?

转载 作者:行者123 更新时间:2023-12-03 18:29:46 24 4
gpt4 key购买 nike

相关问题

这个问题很相关,但已经 2 岁了:In memory OLAP engine in Java

背景

我想从内存中的给定表格数据集创建一个类似于矩阵的数据透视表

例如按婚姻状况计数的年龄(行是年龄,列是婚姻状况)。

  • 输入 :人员列表,带有年龄和一些 bool 属性(例如已婚),
  • 所需的输出 :人数,按年龄(行)和已婚(列)

  • 我试过的(Scala)
    case class Person(val age:Int, val isMarried:Boolean)

    ...
    val people:List[Person] = ... //

    val peopleByAge = people.groupBy(_.age) //only by age
    val peopleByMaritalStatus = people.groupBy(_.isMarried) //only by marital status

    我设法以天真的方式做到了,首先按年龄分组,然后 map这是在做 count通过婚姻状况,并输出结果,那么我 foldRight聚合
    TreeMap(peopleByAge.toSeq: _*).map(x => {
    val age = x._1
    val rows = x._2
    val numMarried = rows.count(_.isMarried())
    val numNotMarried = rows.length - numMarried
    (age, numMarried, numNotMarried)
    }).foldRight(List[FinalResult]())(row,list) => {
    val cumMarried = row._2+
    (if (list.isEmpty) 0 else list.last.cumMarried)
    val cumNotMarried = row._3 +
    (if (list.isEmpty) 0 else l.last.cumNotMarried)
    list :+ new FinalResult(row._1, row._2, row._3, cumMarried,cumNotMarried)
    }.reverse

    我不喜欢上面的代码,它效率不高,难以阅读,我相信有更好的方法。

    问题

    我如何分组“两者”?以及如何对每个子组进行计数,例如

    How many people are exactly 30 years old and married?



    另一个问题,是我如何做一个总计,来回答这个问题:

    How many people above 30 are married?



    编辑:

    谢谢你所有的好答案。

    只是为了澄清,我希望输出包含一个带有以下列的“表格”
  • 年龄(升序)
  • 已婚人数
  • Num 未婚
  • 运行总结婚
  • 跑总未婚

  • 不仅要回答这些特定的查询,还要生成一份报告,可以回答所有此类问题。

    最佳答案

    你可以

    val groups = people.groupBy(p => (p.age, p.isMarried))

    进而
    val thirty_and_married = groups((30, true))._2
    val over_thirty_and_married_count =
    groups.filterKeys(k => k._1 > 30 && k._2).map(_._2.length).sum

    关于scala - 在 Java/Scala 的内存 olap/数据透视表中是否有数据结构/库要做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12980043/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com