Spark之搜狗日志查询实战
1、下载搜狗日志文件:
地址:http://www.sogou.com/labs/resource/chkreg.php
2、利用WinSCP等工具将文件上传至集群。
3、创建文件夹,存放数据:
mkdir /home/usr/hadoopdata
4、将搜狗日志数据移到(mv命令)3中创建的目录下,并解压
5、查看解压后文件格式
file SogouQ.sample
显示:
不是UTF-8,用head/cat命名查看,中文乱码(影响后续进程),需对文件格式进行转换:
iconv -f gb2312 SogouQ.sample -o SogouQ.sample2
再次查看即可正常显示中文。
6、启动集群(Hadoop、spark)。启动后,进入hadoop安装目录下,在hdfs上新建存放数据的目录,并将5中已进行格式转换后的日志文件放到hdfs上,再查看文件是否上传成功,命令如下:
cd /home/usr/hadoop/hadoop-2.8.2hadoop fs-mkdir /sogouminihadoop fs-put /home/chenjj/hadoopdata/testdata/SogouQ.sample2 /sogouminihadoop fs-ls /sogoumini/SogouQ.sample2
结果:
7、进入spark安装目录下bin,启动spark-shell,由于本集群采用yarn模式部署的,故启动时选取yarn,其他参数可自行配置。
cd spark/spark-2.1.1-bin-hadoop2.6/bin./spark-shell --master yarn --executor-memory 2g --driver-memory 2g
8、进入spark-shell后,执行以下操作,在每句后面有说明
val path="hdfs:///sogoumini/SogouQ.sample2"——声明路径val sogouminirdd=sc.textFile(path)——读取hdfs上搜狗日志文件sogouminirdd.count()——查看文件总共多少条记录val mapsogouminirdd=sogouminirdd.map(_.split("\s")).filter(_.length==6)——筛选出格式正确的数据mapsogouminirdd.count()——查看格式正确的有多少条,是否所有数据均正确val firstmapsogouminirdd=mapsogouminirdd.filter(_(3).toInt==1).filter(_(4).toInt==1)——筛选出当日搜索结果排名第一同时点击结果排名也是第一的数据量firstmapsogouminirdd.count()——查看结果是第多少条数据
注:(1)元数据文件格式和官网描述不一致问题,官方说明排名和用户点击的顺序号之间是以Tab键分隔的,而实际是以空格分隔。
解决方法: spark分词时用split("\s")代替split("t"))。
9、使用toDebugString查看RDD血统(lineage)
firstmapsogouminirdd.toDebugString
结果如下:
可见其血统关系是:HadoopRDD->MappedRDD->MappedRDD->FilteredRDD->FilteredRDD->FilteredRDD。
10、用户ID查询次数排行榜:
val sortrdd=mapsogouminirdd.map(x=>(x(1),1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1))
sortrdd.count()
11、将结果存放在hdfs中:
val outputpath="hdfs:///sogoumini/SogouQresult.txt"——存放路径及文件名sortrdd.saveAsTextFile(outputpath)——存结果
- 【自然框架】用CMS的栏目举例,聊一聊从“一层”到“三层”的变化
- java如何自定义鼠标指针
- 面向对象最重要的是“抽象”,三层最重要的也是“抽象”,没有抽象就不是真正的面向对象、三层。
- 唯一不变的就是一直在变”--“数据”的华丽“变身术”
- 借用 疯狂秀才 的页面,修改了一下自然框架后台管理的页面。
- PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范
- PDF.NET数据开发框架 之SQL-MAP使用存储过程
- 用接口实现事件的一种方法,只是玩玩。
- 国内研究人员首次Wifi重大漏洞利用实现 | Krack攻击测试套件打包
- 想成为优秀程序员必知的要点
- Attribute(特性),怎么用才更好?
- 如何使用Airgeddon搭建基于软件的WIFI干扰器
- 还在写SQL的同志,去喝杯咖啡吧!
- 使用XSD编写具有智能提示的XML文件(以SQL-MAP脚本为实例)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter 中渐变的高级用法
- 【Flutter实战】动画核心(1/2)
- 【Flutter实战】动画核心(2/2)
- Flutter 1.17 新 Material motion 规范的预构建动画
- Canonical通过Flutter启用Linux桌面应用程序支持
- Flutter 快捷开发 Mac Android Studio 篇
- TRTC Android端开发接入学习之互动直播(七)
- Flutter 实现酷炫的3D效果
- 【Flutter 实战】一文学会20多个动画组件
- 【Flutter 实战】动画序列、共享动画、路由动画
- 【Flutter 实战】自定义动画-涟漪和雷达扫描
- Flutter —布局系统概述
- 【Flutter 实战】全局点击空白处隐藏键盘
- 我对Flutter的第一次失望
- 【Flutter 实战】各种各样形状的组件