我希望我理解的是正确的。这里有一个完整的例子。
case class Data(date: String, uid: String, site: String, success: Int)
val sampleData = List(
Data("2014-07-14","userA","google",1),
Data("2014-07-14","userA","google",1),
Data("2014-07-14","userB","google",1),
Data("2014-07-14","userC","yahoo",1),
Data("2014-07-14","userD","facebook",1)
)
sampleData.groupBy(_.date).map
{case (date, datelist) => (date, datelist.groupBy(_.site).map
{case (site, sitelist) => (site, sitelist.groupBy(_.uid).size)})}
输出结果为:
Map(2014-07-14 -> Map(google -> 2, yahoo -> 1, facebook -> 1))
基本上,您会得到每个日期的一个地图,其中包含来自不同用户的网站访问。请注意,来自
userA
的2个访问计为1个。
sitelist.groupBy(_.uid).size
计算不同uid
的访问次数。
编辑 是的,可以在不使用额外数据结构的情况下实现。现在你只需要处理数组的索引。
val fileText = """2014-07-14,userA,google,1
2014-07-14,userA,google,1
2014-07-14,userA,google,1
2014-07-14,userB,google,1
2014-07-14,userC,yahoo,1
2014-07-14,userD,facebook,1""".stripMargin
fileText.lines.map(_.split(",")).toList.groupBy(_(0)).map
{case (date, datelist) => (date, datelist.groupBy(_(2)).map
{case (site, sitelist) => (site, sitelist.groupBy(_(1)).size)})}