SparkCore1

1.RDD的五大特性?

(1)A list of partition:他是RDD的基本构成,就是一系列分区。

(2)A function for computing each split/partitio:一个计算方法是作用在每个分区上面的。

(3)A list of dependencies on other RDDs:RDD会记录它的依赖 ,为了容错(重算,cache,checkpoint),也就是说在内存中的RDD操作时出错或丢失会进行重算。比如RDD A =》RDD B ==》RDD C,那么C与A直接是有依赖关系的,当我们的某个分区挂掉的时候,spark可以通过我们的依赖关系来恢复这   一个分区。

(4) Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned):可选项,如果RDD里面存的数据是key-value形式,则可以传递一个自定义的Partitioner进行重新分区,例如这里自定义的Partitioner是基于key进行分区,那则会将不同RDD里面的相同key的数据放到同一个partition里面。

(5)Optionally, a list of preferred locations to compute each split on:最优的位置去计算,也就是数据的本地性。  

2.取出域名和流量总和

import org.apache.spark.{SparkConf, SparkContext}

object LogApp {
//Spark编程模板,创建SparkContext
  def main(args: Array[String]): Unit = {
    val sparkConf= new SparkConf().setAppName("LogApp").setMaster("local[2]")
    val sc =new SparkContext(sparkConf)
//第二步:读取日志文件并进行相应的业务逻辑处理
val lines=sc.textFile("file:///E:/若泽数据/零基础大数据篇第三期/Hadoop综合编程/outputFile.txt")
lines.map(x=>{
   val temp= x.split("\t")  //以tab建作为分隔符号
  (temp(0),temp(1).toLong)  //因为textFile取出来的是个字符串,不转类型的话,加出来的不就是一个字符串了吗
}).reduceByKey(_+_).foreach(println) //reduceBykey,将key相同的分到一组去,再做俩俩相加

//第三步:关闭SparckContext
    sc.stop()
  }
}

上面报错了:java.lang.NumberFormatException: For input string: "o"

这个的原因是因为字符串转number类型的错误,因为我要转成为number的字符串出现了其他类型的字符,比如我这个就是因为出现了字母,所以报错了。

这就是一个脏数据的问题,如何处理呢?这个方法就是跳过脏数据,遇到就给他赋值为0。

import org.apache.spark.{SparkConf, SparkContext}

object LogApp {
//Spark编程模板,创建SparkContext
  def main(args: Array[String]): Unit = {
    val sparkConf= new SparkConf().setAppName("LogApp").setMaster("local[2]")
    val sc =new SparkContext(sparkConf)
//第二步:读取日志文件并进行相应的业务逻辑处理
    //TO:求每个域名的流量
val lines=sc.textFile("file:///E:/若泽数据/零基础大数据篇第三期/Hadoop综合编程/outputFile.txt")
lines.map(x=>{
   val temp= x.split("\t")  //以tab建作为分隔符号
  var traffic = 0l
  try{
      traffic=temp(2).trim.toLong //加trim防止空格,再一次报错
  }
  catch {
    case e:Exception=>traffic=0l
  }
  (temp(0),traffic)  //因为textFile取出来的是个字符串,不转类型的话,加出来的不就是一个字符串了吗
}).reduceByKey(_+_).foreach(println) //reduceBykey,将key相同的分到一组去,再做俩俩相加

//第三步:关闭SparckContext
    sc.stop()
  }
}

这个时候呢,问题又来了,如何确定成功了多少条数据,失败了多少条呢?

3.求前10域名的流量

下面这个程序,还没完成,就是调用getprovince这个方法还没完成。

import G3day05.IpUntils
import org.apache.spark.{SparkConf, SparkContext}

object LogApp {
//Spark编程模板,创建SparkContext
  def main(args: Array[String]): Unit = {
    val sparkConf= new SparkConf().setAppName("LogApp").setMaster("local[2]")
    val sc =new SparkContext(sparkConf)
//第二步:读取日志文件并进行相应的业务逻辑处理
    //TO:求每个域名的TOPn的流量,也就是一个降序的过程
    val lines=sc.textFile("file:///E:/若泽数据/零基础大数据篇第三期/Hadoop综合编程/outputFile.txt")
    lines.map ( s =>{  //lines是调用map函数,map映射是一种可迭代的键值对(key/value)结构,所有的值都可以通过键来获取。
val temp = s.split("\t")
      (IpUntils.getProvince(temp(2)),1)    //每一句代码,都有可能出现错误,需要注意每一行的问题。
    }).take(10).reduceByKey(_+_).sortBy(_._2,false)
    sc.stop()
  }
}

 

def sortBy[K](f : scala.Function1[T, K], asceding : sla.Bolean = { /* compiled code */ }, numPartitions: scala.Int = { /* compiled code */ })(implicit ord : scala.Ordering[K], ctag : scala.reflect.ClassTag[K]) : org.apache.spark.rdd.RDD[T] = { /* compiled code */ }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值