微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sparkSql实战案例

需求:

统计每个用户的累计访问次数

要求使用sql统计出每个用户的累积访问次数,如下表所示:

用户id 月份 小计 累积
u01 2021-01 11 11
u01 2021-02 12 23
u02 2021-01 12 12
u03 2021-01 8 8
u04 2021-01 3 3

数据集:
useraccesscount

userid,visitdate,visitcount
u01,2021/1/21,5
u02,2021/1/23,6
u03,2021/1/22,8
u04,2021/1/20,3
u01,2021/1/23,6
u01,2021/2/21,8
u02,2021/1/23,6
u01,2021/2/22,4

思路:
1.修改数据格式。从结果反推,需要查询实现按照 年-月 分组的数据,所以我们这一步先对原数据进行一个处理。
2.计算每人单月访问量,获取每个用户,每个月的访问量。
3.按月累计计算访问量。用一个sum开窗函数,对userid进行分组,date时间进行排序即可。

代码

package shangxuetang

import org.apache.spark.sql.SparkSession
//统计每个用户的累计访问次数
object UserAccessCount {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("").master("local[*]").getorCreate()
    val df = spark.read.option("header",true).csv("D:\\IDEAProject\\sparksql\\src\\main\\resources\\useraccesscount")
    //df.show()
    df.createTempView("temp1")
    //1.修改数据格式
    //从结果反推,需要查询实现按照 年-月 分组的数据,所以我们这一步先对原数据进行一个处理。
    spark
      .sql(
        """
          |select
          |     userid,
          |     date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM') date,
          |     visitcount
          |from
          |     temp1
          |""".stripMargin).createTempView("temp2")

    //2.计算每人单月访问量,获取每个用户,每个月的访问量。
      spark
        .sql(
          """
            |select userid,date,sum(visitcount) as usercount
            |
            |from temp2
            |group by userid,date
            |order by userid,date
            |""".stripMargin).createTempView("temp3")

    //3.按月累计计算访问量。用一个sum开窗函数,对userid进行分组,date时间进行排序即可。
    spark
      .sql(
        """
          |select userid,date,usercount,
          |sum(usercount) over (partition by userid order by date asc) as totalcount
          |from temp3
          |order by userid
          |""".stripMargin).show()

  spark.stop()

  }
}

结果:

//第一步结果
+------+-------+----------+
|userid|   date|visitcount|
+------+-------+----------+
|   u01|2021-01|         5|
|   u02|2021-01|         6|
|   u03|2021-01|         8|
|   u04|2021-01|         3|
|   u01|2021-01|         6|
|   u01|2021-02|         8|
|   u02|2021-01|         6|
|   u01|2021-02|         4|
+------+-------+----------+

//第二步结果
+------+-------+---------+
|userid|   date|usercount|
+------+-------+---------+
|   u01|2021-01|     11.0|
|   u01|2021-02|     12.0|
|   u02|2021-01|     12.0|
|   u03|2021-01|      8.0|
|   u04|2021-01|      3.0|
+------+-------+---------+

//最终结果
+------+-------+---------+----------+
|userid|   date|usercount|totalcount|
+------+-------+---------+----------+
|   u01|2021-01|     11.0|      11.0|
|   u01|2021-02|     12.0|      23.0|
|   u02|2021-01|     12.0|      12.0|
|   u03|2021-01|      8.0|       8.0|
|   u04|2021-01|      3.0|       3.0|
+------+-------+---------+----------+

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐