使用Spark进行搜狗日志分析实例——map join的使用
map join相对reduce join来说,可以减少在shuff阶段的网络传输,从而提高效率,所以大表与小表关联时,尽量将小表数据先用广播变量导入内存,后面各个executor都可以直接使用
package sogolog
import org.apache.hadoop.io.{LongWritable, Text}
import org.apache.hadoop.mapred.TextInputFormat
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
class RddFile {
def readFileToRdd(path: String): RDD[String] = {
val conf = new SparkConf().setMaster("local").setAppName("sougoDemo")
val sc = new SparkContext(conf);
//使用这种方法能够避免中文乱码
readFileToRdd(path,sc)
}
def readFileToRdd(path: String,sc :SparkContext): RDD[String] = {
//使用这种方法能够避免中文乱码
sc.hadoopFile(path,classOf[TextInputFormat], classOf[LongWritable], classOf[Text]).map{
pair => new String(pair._2.getBytes, 0, pair._2.getLength, "GBK")}
}
}
package sogolog
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
import scala.collection.mutable.ArrayBuffer
object MapSideJoin {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("sougoDemo")
val sc = new SparkContext(conf);
val userRdd = new RddFile().readFileToRdd("J:\\scala\\workspace\\first-spark-demo\\sougofile\\user",sc)
//解析用户信息
val userMapRDD:RDD[(String,String)] = userRdd.map(line=>(line.split("\t")(0),line.split("\t")(1)))
//将用户信息设置为广播变量,方便各个任务引用
val userMapBroadCast =sc.broadcast(userMapRDD.collectAsMap())
val searchLogRdd = new RddFile().readFileToRdd("J:\\scala\\workspace\\first-spark-demo\\sougofile\\SogouQ.reduced",sc)
val joinResult = searchLogRdd.mapPartitionsWithIndex((index,f)=>{
val userMap = userMapBroadCast.value
var result = ArrayBuffer[String]()
var count = 0
//搜索日志表join用户表
//原来日志列为:时间 用户ID 关键词 排名 URL
//新的日志列为:时间 用户ID 用户名 关键词 排名 URL
f.foreach( log=>{
count=count+1;
val lineArrs = log.split("\t")
val uid = lineArrs(1)
val newLine:StringBuilder = new StringBuilder()
if(userMap.contains(uid)){
newLine.append(lineArrs(0)).append("\t")
newLine.append(lineArrs(1)).append("\t")
newLine.append(userMap.get(uid).get).append("\t") //从广播变量中根据用户ID获取用户名
for (i<- 2 to lineArrs.length-1){
newLine.append(lineArrs(i)).append("\t")
}
result .+= (newLine.toString())
}
})
println("partition_"+index+"处理的行数为:"+count)
result.iterator
})
//打印结果
joinResult.collect().foreach(println)
}
}
结果展示:

使用Spark进行搜狗日志分析实例——map join的使用的更多相关文章
- 使用Spark进行搜狗日志分析实例——统计每个小时的搜索量
package sogolog import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 使用Spark进行搜狗日志分析实例——列出搜索不同关键词超过10个的用户及其搜索的关键词
package sogolog import org.apache.hadoop.io.{LongWritable, Text} import org.apache.hadoop.mapred.Tex ...
- ELK 日志分析实例
ELK 日志分析实例一.ELK-web日志分析二.ELK-MySQL 慢查询日志分析三.ELK-SSH登陆日志分析四.ELK-vsftpd 日志分析 一.ELK-web日志分析 通过logstash ...
- Spark之搜狗日志查询实战
1.下载搜狗日志文件: 地址:http://www.sogou.com/labs/resource/chkreg.php 2.利用WinSCP等工具将文件上传至集群. 3.创建文件夹,存放数据: mk ...
- 基于Spark的网站日志分析
本文只展示核心代码,完整代码见文末链接. Web Log Analysis 提取需要的log信息,包括time, traffic, ip, web address 进一步解析第一步获得的log信息,如 ...
- spark提交异常日志分析
java.lang.NoSuchMethodError: org.apache.spark.sql.SQLContext.sql(Ljava/lang/String;)Lorg/apache/spar ...
- Spark RDD/Core 编程 API入门系列之动手实战和调试Spark文件操作、动手实战操作搜狗日志文件、搜狗日志文件深入实战(二)
1.动手实战和调试Spark文件操作 这里,我以指定executor-memory参数的方式,启动spark-shell. 启动hadoop集群 spark@SparkSingleNode:/usr/ ...
- 024 关于spark中日志分析案例
1.四个需求 需求一:求contentsize的平均值.最小值.最大值 需求二:请各个不同返回值的出现的数据 ===> wordCount程序 需求三:获取访问次数超过N次的IP地址 需求四:获 ...
- Spark SQL慕课网日志分析(1)--系列软件(单机)安装配置使用
来源: 慕课网 Spark SQL慕课网日志分析_大数据实战 目标: spark系列软件的伪分布式的安装.配置.编译 spark的使用 系统: mac 10.13.3 /ubuntu 16.06,两个 ...
随机推荐
- Haystack
什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch,Whoosh, ...
- Python内置进制转换函数(实现16进制和ASCII转换)
在进行wireshark抓包时你会发现底端窗口报文内容左边是十六进制数字,右边是每两个十六进制转换的ASCII字符,这里使用Python代码实现一个十六进制和ASCII的转换方法. hex() 转换一 ...
- 【做题】CSA49F - Card Collecting Game——思维&dp
原文链接 https://www.cnblogs.com/cly-none/p/CSA49F.html 题意:Alice和Bob在玩游戏.有\(n\)种卡牌,每种卡牌有\(b_i\)张,保证\(\su ...
- Go-单元测试
文章转载地址:https://www.flysnow.org/2017/05/16/go-in-action-go-unit-test.html 什么是单元测试? 单元测试一般用来测 ...
- mysql 插入中文字段报错 "Incorrect string value: '\\xE6\\xB5\\x8B\\xE8\\xAF\\x95...' for column 'title' at row 1"
1. 查看一个 database 或一个 table 的编码show create database mytestdb;show create table testapp_article; mysql ...
- 关于查询ios的app更新的历史版本记录
https://www.qimai.cn 推荐七麦数据 可以查询app的各种版本更新内容 由于历史久远忘记了自己app第一次上架的时间 通过这个可以查询
- PHP算法练习1:两数之和
leetcode地址:https://leetcode-cn.com/problems/two-sum/description/ 题目: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. ...
- power shell 脚本了解
1. https://www.cnblogs.com/xianglongsdu/p/5832984.html 2.https://www.cnblogs.com/lsdb/p/9531338.html ...
- Mysql 更新时间(加上或者减去一段时间)
Mysql时间加减函数为date_add().date_sub() 定义和用法 DATE_ADD() 函数向日期添加指定的时间间隔. DATE_SUB() 函数向日期减少指定的时间间隔. 语法 DAT ...
- Error during generated code invocation: com.intellij.debugger.engine.evaluation.EvaluateException: Method threw 'java.lang.IllegalAccessError' exception.
场景描述: 再从该数据库中读取数据进行处理的时候,需要将某个字段加入到一个动态的map中,然后需要对该map进行filter过滤,在执行过滤方法的时候报错 Error during generated ...