关注公众号:分享电脑学习
回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)

云盘目录说明:

tools目录是安装包
res   目录是每一个课件对应的代码和资源等
doc  目录是一些第三方的文档工具

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

参数说明:

创建一个Maven项目

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

部分示例

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

1. 构建SparkContext上下文对象

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

此时可以运行这两行代码

会出现错误

需要添加一行代码

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

再运行一次

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

添加代码

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

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

2. 基于sc构建RDD

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

将文件上传到指定目录

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

运行可以看到显示

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

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

编写代码

val path = /data/page_views.data

运行也可以查看到结果

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("\t"))

数据进行过滤清洗,获取两个字段(时间、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)
})

基于reduceByKey做统计pv

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

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

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

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

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

与上面值相同

最新文章

  1. windows使用git时出现:warning: LF will be replaced by CRLF
  2. LINQ to SQL语句(15)之String
  3. 使用jquery.qrcode生成二维码支持logo,和中文
  4. C++ 泛型基础
  5. 两个viewport的故事(第一部分)
  6. Security » Authorization » 基于声明的授权
  7. Window 常用命令
  8. MFC读取XML文件并解析
  9. 【Unity3D实战】摇摆直升机开发实战(一)
  10. 李洪强漫谈iOS开发[C语言-026]-符合赋值表达式
  11. putty修改编码
  12. oracle与sql server时间差的取法
  13. entity framework 6 我写了一个公用数据类
  14. sql相关
  15. AngularJs的resource服务与Rest服务交互
  16. springMVC源码分析--SimpleControllerHandlerAdapter(三)
  17. ASP.NET MVC5高级编程 之 Ajax
  18. 020100——00002_OS库
  19. cocos2d-x JS 四人麻将中的服务器位置与客户端位置转换相关
  20. linux下top命令参数详解

热门文章

  1. 7、Redis五大数据类型---集合(Set)
  2. Oracle命名规则
  3. Wireshark(五):TCP窗口与拥塞处理
  4. React中使用 react-router-dom 路由传参的三种方式详解【含V5.x、V6.x】!!!
  5. js--对象内部属性与 Object.defineProperty()
  6. 延时间隔(Project)
  7. HMS Core版本发布公告
  8. 有时候错误很奇怪啊,Comparator问题
  9. Spring工具类 非spring管理环境中获取bean及环境配置
  10. Linux(Centos)配置vsftp使用账号密码(虚拟用户)登录ftp进行文件上传和修改