【问题标题】:spark sql: count occurrences with different predicatesspark sql:计算不同谓词的出现次数
【发布时间】:2018-07-29 01:34:57
【问题描述】:

假设我有这样的数据

| department | user  | purchases |
|:-----------|------:|:---------:|
| sport      | user1 |     1     |
| video      | user1 |     7     |
| audio      | user2 |     5     |
| book       | user2 |     3     |
| sport      | user2 |     8     |

等等。我需要像这样在每个类别中计算购买次数:

| department | users5  | users7  |  users16 |
|:-----------|--------:|:-------:|:--------:|
| sport      | 10      |   5     |     3    |
| video      | 7       |   6     |     4    |
| audio      | 3       |   1     |     0    |
| book       | 5       |   1     |     0    |

users5 - 在该部门有

users7 - 在该部门进行 5 到 7 次购买的用户计数

users16 - 在该部门进行 7 到 16 次购买的用户计数

我可以通过以下方式实现目标:(spark sql伪代码)

val users5 = df.filter("purchases" < 5).groupby("category").agg(count("user"))
val users7 = df.filter("purchases" >= 5 AND "purchases" < 7).groupby("category").agg(count("user"))
val users16 = df.filter("purchases" >= 7 AND "purchases" < 16).groupby("category").agg(count("user"))
users5.join(users7, Seq("category"), "outer").join(users16, Seq("category"), "outer")

我的问题是有没有更通用的明确方法来做同样的工作? 我正在使用 apache spark 2.3

【问题讨论】:

  • 你对sql语句还好吗?

标签: sql apache-spark apache-spark-sql


【解决方案1】:

一个带有 SQL 查询的选项。

val res=spark.sql("""
                  select category
                        ,count(case when purchases<=5 then user end) as users5
                        ,count(case when purchases>5 and purchases<7 then user end) as users7
                        ,count(case when purchases>=7 and purchases<16 then user end) as users16
                  from df
                  group by category
                  """
                 )

【讨论】:

  • 完全有道理。谢谢!
【解决方案2】:

如果你想用 api 方式,那么下面是解决方案

import org.apache.spark.sql.functions._
df.groupBy("category").agg(sum(when(col("purchases") < 5, 1).otherwise(0)).as("users5"),
  sum(when(col("purchases") >= 5 && col("purchases") < 7, 1).otherwise(0)).as("users7"),
  sum(when(col("purchases") >= 7 && col("purchases") < 16, 1).otherwise(0)).as("users16"))
  .show(false)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多