Spark sql总和基于多个案例

时间:2018-03-28 00:58:14

标签: apache-spark apache-spark-sql

我正在使用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阶段比赛,但她只参加比赛第一阶段

1 个答案:

答案 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    |
+------+-----+