Core的一些操作就是更灵活复杂的运用wc
源数据:
下列源代码叙述了三个案例:
package com.ruoze.spark
import org.apache.spark.{SparkConf, SparkContext}
object LogApp {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("LogApp").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
val path="file:///G:/outputFile.txt"
val lines = sc.textFile(path)
//求每个域名的流量
/**
* 1.获取到日志中每条记录的域名和流量
* 2.按照域名进行分组求和
*/
lines.map(x=>{
val temp = x.split("\t")
var traffic = 0L
try{
//把错误的流量格式筛选掉
traffic = temp(1).trim.toLong
}catch{
case e:Exception => traffic = 0L
}
(temp(0),traffic)
}).reduceByKey(_+_).take(10).foreach(println)
//求每个省份的访问次数的topN
/**
*获取到ip
*分析获取省份,赋键值对(省份,1)
*reduceByKey(_+_)求和排序
*/
// lines.map(x => {
// val temp = x.split("\t")
//取ip,我数据里没有
// (ipUtils.getProvince(temp(6)),1)
// }).reduceByKey(_+_).sortBy(_._2,false)
//求每个域名下按访问数有多到少排列的文件资源
/**取到资源
*把域名和资源作为k,1为v
*求和然后按域名分组
*转list然后排序
*为方便查看直接取排序后的资源查看
*/
// lines.map(x => {
// val temp = x.split("\t")
// ((temp(0),getResource(temp(12))),1)
// }).reduceByKey(_+_).groupBy(_._1._1)
// .mapValues(_.toList.sortBy(_._2).reverse.take(10))
// .map(_._2)
// .collect().foreach(println)
sc.stop()
}
def getResource(url:String)={
val pathTemp = url.replace("//","")
var pathIndex = pathTemp.indexOf("/")
var path = ""
if(pathIndex != -1){
path = pathTemp.substring(pathIndex)
pathIndex = path.indexOf("?")
if(pathIndex != -1){
path = path.substring(0,pathIndex)
}
}
path
}
}
操作结果:
案例1:
案例2和案例3由于我没有源数据,所以直接截取课堂上的结果:
案例3: