【问题标题】:Spark sql sum based on multiple casesSpark sql sum 基于多种情况
【发布时间】:2018-03-28 00:58:13
【问题描述】:

我正在使用 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
当level > 20 stage应该是5

结果应该是这样的

+--------+-------+
| player | count |
+--------+-------+
| John   |     2 |
| Adam   |     1 |
| Sarah  |     1 |
| Bruce  |     0 |
+--------+-------+

假设约翰,他的等级是 4,所以他应该在 stage2 上演奏,根据他在那个舞台上演奏 2 次的数据,在 Sarah 的情况下,她是 6 级,所以她应该在 Stage 3 上演奏,但她只在舞台上演奏第一阶段

【问题讨论】:

  • 舞台栏你已经搞定了吗?
  • @ShankarKoirala 是的,我在第一个表中的每一列都做了
  • 那么计数值是怎么计算的?
  • 假设 John,他的等级是 4,所以他应该在 stage2 上演奏,根据他在那个舞台上演奏 2 次的数据,在 Sarah 的情况下,她是 6 级,所以她应该在 stage 3 上演奏但她只在那个舞台上演奏过一个
  • 布鲁斯呢,怎么 0?

标签: apache-spark apache-spark-sql


【解决方案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    |
+------+-----+

【讨论】:

  • 最大值在这里不起作用,因为玩家可以在较低的舞台上演奏,而不是像布鲁斯那样的最大值。
  • @Am1rr3zA 更新了答案请检查,它现在应该可以工作了
  • 我赞成它,但让我看看它是否真的适用于我的情况,然后我会接受它
  • 有什么好的方法可以让拆分部分更加成熟,因为我的真实数据是 satge_01 而不是 stage_1,而我的 stage 是 20。我有 stage_01 和 stage_20 等等
  • 想不出更好的办法,在split之后转换成int
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2020-04-21
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多