我正在使用Spark数据框从我的数据中提取一些统计数据。 我们假设我的数据是:
+----+------------+------+--------+-------+---------+
| id | date | type | player | level | stage |
+----+------------+------+--------+-------+---------+
| 1 | 2018-03-26 | XXX | John | 4 | stage_2 |
| 2 | 2018-03-26 | YYY | Adam | 1 | stage_1 |
| 3 | 2018-03-26 | ZZZ | Sarah | 6 | stage_3 |
| 4 | 2018-03-26 | XXX | Bruce | 12 | stage_2 |
| 5 | 2018-03-26 | YYY | Sarah | 6 | stage_1 |
| 6 | 2018-03-26 | ZZZ | John | 4 | stage_2 |
+----+------------+------+--------+-------+---------+
我想在这里计算一些数据,例如,当我想要计算每天有XXX
类型的东西时,我会做类似的事情
dataframe.groupBy(date).agg(expr("sum(case when type = 'XXX'then 1 else 0 end) as XXX_Count"))
但我不知道如何处理更复杂的用例。
假设我想根据他/她的等级计算每个玩家在最高阶段玩多少时间
我需要这个
1到3级之间的等级应为1
当3到6级之间的级别应为2
当6到12级之间的级别应为3
当12到20级之间的等级应为4
当等级> 20阶段应为5
结果应该是
+--------+-------+
| player | count |
+--------+-------+
| John | 2 |
| Adam | 1 |
| Sarah | 1 |
| Bruce | 0 |
+--------+-------+
让我们说约翰,他的等级是4,所以他应该在第二阶段比赛,并根据他在那个阶段打了2次的数据,在莎拉的情况下,她是6级所以她应该在第3阶段比赛,但她只参加比赛第一阶段
答案 0 :(得分:1)
您可以将最大值计算为低于expr
val level = col("level")
val expr = when((level >= 1 && level < 3), 1)
.when((level >= 3 && level < 6), 2)
.when((level >= 6 && level < 12), 3)
.when((level >= 12 && level < 20), 4)
.when(level > 20, 5)
.otherwise(0)
df.withColumn("max", expr)
.withColumn("stage", split($"stage", "_")(1))
.withColumn("max", when($"stage" === $"max", 1).otherwise(0))
.groupBy($"player").agg(sum($"max"))
.show(false)
输出:
+------+-----+
|player|count|
+------+-----+
|Sarah |1 |
|John |2 |
|Adam |1 |
|Bruce |0 |
+------+-----+