摸鱼大数据——Spark Core——RDD综合案例——点击流

拓展网站百度统计

1、点击流案例

1.1 数据源介绍

点击流日志数据结构说明: Nginx日志 访问网站的日志数据

数据字段说明:
1- ip地址
2- 用户标识cookie信息(- - 表示没有)
3- 访问时间(时间,时区)
4- 请求方式(get / post /Head ....)
5- 请求的资源路径
6- 请求的协议
7- 请求状态码: 200 成功
8- 响应的字节长度
9- 来源的URL( - 标识直接访问, 不是从某个页面跳转来的)
10- 访问的浏览器标识

1.2 需求分析

注意:需求清洗数据(去除两端空白以及空行数据)

需求一:统计网站的总pv(访问量) 和 uv(独立访客数)
    pv: 人次。一个人一天买了3次奶茶,pv=3
    uv: 人数。一个人一天买了3次奶茶,uv=1
    ip地址可以唯一标识一个用户
​
需求二:统计请求的资源路径的TOP10
    思路: 通过空格进行切分,再获取对应位置的数据

1.3参考代码

答案不唯一

# 导包
import os
from pyspark import SparkConf, SparkContext
​
# 绑定指定的python解释器
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
​
​
def get_uv_pv(etl_rdd):
    """
    这是一个计算pv和uv数的函数
    :param etl_rdd: 参数是经过清洗转换后的RDD
    :return: 无
    """
    pv_cnt = etl_rdd.count()
    print(f"pv数为{pv_cnt}")
    uv_cnt = etl_rdd.map(lambda line_list: line_list[0]).distinct().count()
    print(f"uv数为{uv_cnt}")
​
​
def get_top10_source(etl_rdd,n):
    """
    这是获取topn资源的函数
    :param etl_rdd:参数是经过清洗转换后的RDD
    :return:无
    """
    all_sorce_RDD = etl_rdd.map(lambda line_list: (line_list[6], 1)).reduceByKey(lambda agg, curr: agg + curr)
    # 方式1: 直接使用top,如果要多次使用top,每次都要重新排序
    top10_demo1 = all_sorce_RDD.top(n, lambda t: t[1])
    print(top10_demo1)
    # 方式2: 先用sortBy降序排序,然后使用take取前10
    all_sorce_RDD_sort = all_sorce_RDD.sortBy(lambda t: t[1], ascending=False)
    top10_demo2 = all_sorce_RDD_sort.take(n)
    print(top10_demo2)
​
​
# 创建main函数
if __name__ == '__main__':
    # 1.创建SparkContext对象
    conf = SparkConf().setAppName('pyspark_demo').setMaster('local[*]')
    sc = SparkContext(conf=conf)
​
    # 2.数据输入
    textRDD = sc.textFile('file:///export/data/spark_project/spark_core/data/access.log')
    print(textRDD.count())  # 测试未过滤数据14619条
    # 3.数据处理(切分,转换,分组聚合)
    etlRDD = textRDD.filter(lambda line: line.strip() != '').map(lambda line: line.split()).filter(
        lambda line_list: len(line_list) >= 12)
    print(etlRDD.count())  # 测试过滤转换后数据13769条
    # 4.数据分析并输出
    # 抽取方法的快捷键: 先选中具有特定功能的代码块,再按ctrl+alt+M,起名即可
    # 需求一:统计网站的总pv(访问量)和uv(独立访客数)
    get_uv_pv(etlRDD)
    # 需求二:统计请求的资源路径的TOP10
    get_top10_source(etlRDD,10)
​
    # 5.关闭资源
    sc.stop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

困了就倒头睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值