spark练习案例_Spark案例练习-PV的统计

承接上一篇文档《Spark应用的结构》

参数说明:

a5e7e193185c32ec99fb0821faebe55e.png

创建一个Maven项目

Pom文件引入jar,配置信息已经完成,大家可以直接去网盘下载,版本号根据自己的安装情况调整

部分示例

7c2eef151fb13e7a9f745c1214fb498c.png

创建一个scala文件,编写代码

1. 构建SparkContext上下文对象

val conf = new SparkConf()val sc = new SparkContext(conf)

此时可以运行这两行代码

540a121009600d70a5267b506b60624e.png

会出现错误

b0d95d656f74b25a18a81681314b4c62.png

需要添加一行代码

setMaster("local")// 指定应用在哪儿执行,可以是local、或者stadnalone、yarn、mesos集群
b77e9bf5cac80e1a8643e0864a2a2bff.png

再运行一次

又报一次错,这个是要求指定应用的名字

53bbe1b40241a40f6cee5bf9af2a4928.png

添加代码

.setAppName("pvtest") //指定应用的名字
49298c1d96f4bb4985bcba5c179596e1.png

再运行就可以了(启动hadoop)

2. 基于sc构建RDD

端口为core-site.xml中配置的

79a58ce3662c9eb58bfc377e4f59920b.png

将文件上传到指定目录

4ad56b0c945bb4277d111b99d47c6576.png
val path = "hdfs://ip:8020/data/page_views.data" //HDFS的schema 给定数据的路径val rdd: RDD[String] = sc.textFile(path)println("总共有" + rdd.count()+ "条数据")
1e9fdc98eae228e8e514db1d389a0190.png

运行可以看到显示

f9015d60c4e3c61fd82255ebf45e01c0.png

如果不想写schema的话,需要将hadoop的两个文件拷贝到项目的src/main/resources中

两个文件是hadoop的:hdfs-site.xml和core-site.xml

44c47356efd445bdb1ba30eb541321b9

编写代码

val path = /data/page_views.data
0d056df11fcce714bb03f233b4048579.png

运行也可以查看到结果

3. 业务实现

思路:

(1)分析可知道:数据分为7个字段,业务需要三个字段(时间,URL,guid),计算某一个时间的PV的值(2)数据进行过滤清洗,获取两个字段(时间、url)(3)url非空,时间非空,时间字符串的长度必须大于10(4)sql: select date, count(url) from page_view group by date;(5)sql: select date, count(1) from page_view group by date;(6)分别用reduceByKey和groupByKey进行数据处理

我们一步步来

先分割数据

val rdd1 = rdd.map(line => line.split(""))

数据进行过滤清洗,获取两个字段(时间、url)

url非空,时间非空,时间字符串的长度必须大于10

.filter(arr => {//保留正常数据arr.length >2 && arr(1).trim.nonEmpty && arr(0).trim.length > 10})

截取数据

.map(arr => {val date = arr(0).trim.substring(0,10)val url = arr(1).trim(date,1) // (date,url)})
caa06ba4b672b1c89d96a783725d2bfa.png

基于reduceByKey做统计pv

val pvRdd = rdd1.reduceByKey(_+_)println("pv------------------" + pvRdd.collect().mkString(";"))

数据表示2013年5月19日一共有100000条访问数据

7192c88892887d13037ef1617e372413.png

也可以基于groupByKey实现pv统计(这个可以试一下,如果不行就使用reduceByKey)

groupByKey相当于把相同的key的value放到迭代器里面,也就是这些value都放到内存里面,如果value值数据量撑爆内存,就会OOM异常

val pvRdd = rdd1.groupByKey().map(t => {val date = t._1val pv = t._2.size(date,pv)})println("pv------------------" + pvRdd.collect().mkString(";"))

与上面值相同

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值