Spark大数据处理学习笔记(3.8.2) Spark RDD典型案例-利用RDD统计每日新增用户

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/Twpwe


一、任务目标

  • 已知有以下用户访问历史数据,第一列为用户访问网站的日期,第二列为用户名。
2023-05-01,mike
2023-05-01,alice
2023-05-01,brown
2023-05-02,mike
2023-05-02,alice
2023-05-02,green
2023-05-03,alice
2023-05-03,smith
2023-05-03,brian

在这里插入图片描述

  • 现需要根据上述数据统计每日新增的用户数量,期望统计结果。
2023-05-01新增用户数:3
2023-05-02新增用户数:1
2023-05-03新增用户数:2

  • 即2023-05-01新增了3个用户(分别为mike、alice、brown),2023-05-02新增了1个用户(green),2023-05-03新增了两个用户(分别为smith、brian)。

二、准备工作

2.1 在本地创建用户文件

  • /home目录里创建users.txt文件
    在这里插入图片描述

2.2 将用户文件上传到HDFS指定位置

  • 先创建/newusers/input目录,再将用户文件上传到该目录
    在这里插入图片描述

三、完成任务

3.1 在Spark Shell里完成任务

3.1.1 读取文件,得到RDD

  • 执行命令:val rdd1 = sc.textFile("hdfs://master:9000/newusers/input/users.txt")
    在这里插入图片描述

3.1.2 倒排,互换RDD中元组的元素顺序

val rdd2 = rdd1.map(
   line => {
       val fields = line.split(",")
       (fields(1), fields(0))
   }
)
rdd2.collect.foreach(println)

在这里插入图片描述

3.1.3 倒排后的RDD按键分组

  • 执行命令:val rdd3 = rdd2.groupByKey()
    在这里插入图片描述

3.1.4 取分组后的日期集合最小值,计数为1

  • 执行命令:val rdd4 = rdd3.map(line => (line._2.min, 1))
    在这里插入图片描述

3.1.5 按键计数,得到每日新增用户数

  • 执行命令:val result = rdd4.countByKey()
    在这里插入图片描述
  • 执行命令:result.keys.foreach(key => println(key + "新增用户:" + result(key)))
    在这里插入图片描述

3.1.6 让输出结果按日期升序

  • 执行命令:val keys = result.keys.toList.sorted,让键集升序排列
    在这里插入图片描述
  • 按日期降序
    在这里插入图片描述

3.2 在IntelliJ IDEA里完成任务

3.2.1 打开RDD项目

在这里插入图片描述

3.2.2 创建统计新增用户对象

  • cn.kox.day07包里创建CountNewUsers对象
    在这里插入图片描述
package cn.kox.rdd.day07

import org.apache.spark.{SparkConf, SparkContext}
/**
 * @ClassName: CountNewUsers
 * @Author: Kox
 * @Data: 2023/6/15
 * @Sketch:
 */
object CountNewUsers {
  def main(args: Array[String]): Unit = {
    // 创建Spark配置对象
    val conf = new SparkConf()
      .setAppName("CountNewUsers") // 设置应用名称
      .setMaster("local[*]") // 设置主节点位置(本地调试)
    // 基于Spark配置对象创建Spark容器
    val sc = new SparkContext(conf)
    // 读取文件,得到RDD
    val rdd1 = sc.textFile("hdfs://master:9000/newusers/input/users.txt")
    // 倒排,互换RDD中元组的元素顺序
    val rdd2 = rdd1.map(
      line => {
        val fields = line.split(",")
        (fields(1), fields(0))
      }
    )
    // 倒排后的RDD按键分组
    val rdd3 = rdd2.groupByKey()
    // 取分组后的日期集合最小值,计数为1
    val rdd4 = rdd3.map(line => (line._2.min, 1))
    // 按键计数,得到每日新增用户数
    val result = rdd4.countByKey()
    // 让统计结果按日期升序
    val keys = result.keys.toList.sorted
    keys.foreach(key => println(key + "新增用户:" + result(key)))
    // 停止Spark容器
    sc.stop()
  }
}

3.2.3 运行程序,查看结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值