环境:
本地:win7 + jdk1.8 + IntelliJ IDEA 2018.1.2 + maven-3.3.9 + scala插件,机器要求可以联网(需要下载各种依赖包)
远程:CentOS7.3 + jdk1.8 + scala-2.11.12 + hadoop-2.6.0-cdh5.7.0 + hive-1.1.0-cdh5.7.0-bin + spark-2.2.0-bin-2.6.0-cdh5.7.0
实例一:
已有用户访问记录表(hive表),用spark core来求用户访问量的TOP5.
create table page_views (
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fileds yerminated by '\t';
load data local infile '/home/hadoop/data/xxx.txt' ...
解决方案:
1. hiveql 直接查询出来结果
select end_user_id,count(1) c from page_views group by end_user_id order by c desc limit 5;
2. 使用Spark Core来实现
2.1 需求分析
1) 用户:
使用tab分割 ==> split
拿到userid ==> splits(5)
(userid, 1)
2) 访问量
reduceByKey(_+_) ==> (userid, n)
3) TOP N
反转 ==> (n, userid)
排序 ==> sortByKey
反转 ==>
take(5)
2.2 实现思路
2.3 代码实现
IDEA创建一个scala类
package com.bigdata.spark.core
import org.apache.spark.{SparkConf, SparkContext}
object AvgAgeCalculatorApp {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf()
val sc = new SparkContext(sparkConf)
val dataFile = sc.textFile("file:///home/hadoop/data/sample_age_data.txt")
// 取出年龄
val ageData = dataFile.map(x => x.split(" ")(1)) //.take(10).foreach(println)
// 求人数
val count = dataFile.count()
// 年龄相加/人数
val totalAge = ageData.map(age => age.toInt).reduce(_+_)
val avgAge = totalAge/count
sc.stop()
}
}
打包并放到服务器上面提交运行
案例二:
已有男女性别、身高数据表
需求:1)统计男女人数;2)男性中最高和最低身高;3)女性中最高和最低身高
分析:
1) RDD ==> MRDD + FRDD,一个RDD拆成2个RDD,分开计算
2) MRDD sort/max/min
3) FRDD sort/max/min
登录 | 立即注册