数据说明
数据:某搜索引擎查询日志
搜索引擎查询日志数据包括搜索引擎部分网页查询需求及用户点击情况的网页查询日志数据集合。
用户ID是根据用户使用浏览器访问搜索引擎时的Cookie信息自动赋值,即同一次使用浏览器输入的不同查询对应同一个用户ID。
注意数据间分割符。
时间 用户ID [查询词] 该URL在返回结果中的排名 用户点击的顺序号 用户点击的URL
00:00:00 2982199073774412 [360安全卫士] 8 3 download.it.com.cn/softweb/software/firewall/antivirus/20067/17938.html
注意:
1.数据间分隔符问题,其中字段3、4之间为空格,其他字段之间为制表符;(可以使用"\s+"对空格、制表符等进行拆分);
2.为了便于分析和数据统一,要求数据分割后长度等于6,过滤不合法数据
需求1:网站(URL)访问量统计,对URL进行过滤,统计日志数据中各个网站URL首页的访问次数,结果写入本地/root/retrievelog/output/url/part-00000,格式见步骤说明。
对URL进行过滤,获取首页网站的访问量,只统计www开头的首页网站;
过滤以www开头的所有URL,对URL进行/切分,获取首页网址,如www.tudou.com;
首页网址搜索频率统计,按首页网址分组聚合,根据频率进行降序排列;
文件保存路径为:/root/retrievelog/output/url/part-00000,结果无需分区;
示例结果:(www.tudou.com,28714) 表示网站URLwww.tudou.com的访问次数为28714。
先导入一下spark的依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.0.0</version>
</dependency>
代码如下:
package com.dd.spark
import java.io.{File, PrintWriter}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object LogAnalyse01 {
def main(args: Array[String]): Unit = {
val sparkConf= new SparkConf().setMaster("local[*]").setAppName("LogAnalyse01")
val sc : SparkContext = new SparkContext(sparkConf)
val fileRDD: RDD[String] = sc.textFile("D:\\test1128\\reduced.txt")
//只获取一下网址内容
val urlRDD: RDD[String] = fileRDD.map( _.split("\t")(4))
//按需要过滤一下不是www打头的
val wwwRDD: RDD[String] = urlRDD.filter(_.startsWith("www"))
//按需要切割一下/
val splitRDD: RDD[String] = wwwRDD.map(_.split("/")(0))
//wordcount操作
val wordRDD: RDD[(String, Int)] = splitRDD.map((_,1))
//按照key聚合一下
val byKeyRDD: RDD[(String, Int)] = wordRDD.reduceByKey(_+_)
//搞一下排序
val sortRDD: RDD[(String, Int)] = byKeyRDD.sortBy(_._2,false)
//将结果写入文件
val writer = new PrintWriter(new File("D:\\test1128\\result01.txt"))
val tuples = sortRDD.collect()
for (elem <- tuples) {
writer.write("("+elem._1 + "," + elem._2 + ")\n")
}
sc.stop()
}
}