欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 摸鱼大数据——Spark Core——RDD综合案例——点击流

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

2024/10/25 14:24:54 来源:https://blog.csdn.net/weixin_65694308/article/details/139901711  浏览:    关键词:摸鱼大数据——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=3uv: 人数。一个人一天买了3次奶茶,uv=1ip地址可以唯一标识一个用户
​
需求二:统计请求的资源路径的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取前10all_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)# 需求二:统计请求的资源路径的TOP10get_top10_source(etlRDD,10)
​# 5.关闭资源sc.stop()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com