Spark如何进行大数据业务处理:
拿到需求之后:
1) 分析
2) 功能拆解:中文描述 <== 详细设计说明书
3) 代码的开发:代码实现
2. 生产上边界值 ==> 使得你的代码具有健壮性 事先考虑一些异常。
避免因为一些异常使整个作业挂掉
WordCount
object WordCounts {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf()
val sc = new SparkContext(sparkConf)
val textFile = sc.textFile(args(0)) //这里的参数如果是一个目录的路径,则将目录下的所有文件写入
wc.collect().foreach(println) //将结果提交到控制台,没什么用
wc.saveAsTextFile(args(1)) //可以以压缩的方式存储 args(1)为写出的操作
sc.stop()
}
}
求用户访问量(每个用户访问的)的TOP5
1) Hive 实现
select user_id,count(1) c from page_views
group by user_id order by c desc limit 5 ;
2) Spark Core 实现
需求:求用户访问量的TOP5 开发其实在做填空
需求分析:用户
以Tab分割 splits
拿到userid splits(5)
访问量
map((_,1))
reduceByKey(_+_)
TOP N
sortBy(_._2)
take(5)
object PageViewsApp{
def main (args:Array[String]) :Unit = {
val sparkConf = new SparkConf()
val sc = new SparkContext(sparkConf)
val textFile = sc.textFile(args(0))
val wc = textFile.map((_.split("\t")(5),1)).reduceByKey(_+_).sortBy(_._2,fault).take(5)
sc.stop()
}
}
计算平均年龄
数据格式: ID + “ ” + 年龄
实现思路:(年龄的总和/人数)
1) 年龄
2) 人数
3) 年龄/人数
object PageViewsApp{
def main (args:Array[String]) :Unit = {
val sparkConf = new SparkConf()
val sc = new SparkContext(sparkConf)
val textFile = sc.textFile(args(0))
val agedata = textFile.map(_.split(" ")(1))
val peoplenum = agedata.count()
val agesum = agedata.map(_.toInt).reduce(_+_)
sc.stop()
}
}
求男女人数及最高和最低身高
数据: ID + “ ” + 性别 + “ ” + 身高
需求: 统计男女人数及最高和最低身高
分析:
1.取出性别
2.RDD => MRDD + FRDD **** (不用分组)
3.max min
求每个域名的流量之和
lines.map(x=>{
val splits = x.split("\t")
var traffic = 0
if(splits.length==72){
val domain = splits(10)
try{ //如果不是数字,就不能tolong,直接报错,没有健壮性
traffic = splits(19).toLong
}catch{
case e:Exception => 0L
}
(domain,traffic)
}else{
("-",0L)
}
}).reduceByKey(_+_).collect.saveAsTextFile(......)
求每个省份的访问次数的TOP10
lines.map(x=>{
val splits = x.split("\t")
if(splits.length==72){
val ip = splits(6)
val province = ip.xxxx
(province,1)
}else{
(" ",1)
}.reduceByKey(_+_)
})
求每个域名下访问数TOP10的文件资源
lines.map(x=>{
val splits = x.split("\t")
if(splits.length==72){
val splits1 = splits(n).split("/")
if(splits1.length>4){
val a = "/"+splits1(3)+"/"+splits1(4)+"/"+splits1(5)+"/"+splits(6).split("?")(0)
(splits1(2), a , 1 ,splits())
}else{
(splits1(2),splits1(3),1,splits())
}
}else{
("","",0,0)
}
})
- 使用SparkCore完成每个域名每个小时的流量统计