RDD实战

RDD操作:三种操作Transformation(算子)和action(得到结果)、controller(容错和性能优化的支持checkpoint和(Cache)persist)。
1、transformation是对已有的RDD创建新的RDD,操作是具有Lazy特性,也就是说在transformation对元素进行处理的时候,只是标记对元素继续处理,不会真正的执行,除非遇到了action或checkpoint时才会真正执行。
2、action会产生一个job,shuffle会产生新的stage。

使用collect,会将会分布在不同的节点上数据收集起来,collect之后Array就是一个元素,不过这个元素是Tuple(key,value)。

在集群上面运行,ReduceByKey(+,1)数字1 为并行度,会产生一个结果文件。
下面是以下几个函数的案例:
map()、filter()、flatMap()、groupByKey()、reduceBykey()、join()、cogroup()

package com.quell.spark
import org.apache.spark.{SparkConf, SparkContext}
object Transformation {

  def main(args:Array[String]): Unit = {
    val sc=sparkContext("Transformation")
    mapTransformation(sc)    //map案例
    filteredTransformation(sc)  //filter案例
   faltmapTransformation(sc)   //flatMap案例
    groupByKeyTransforamtion(sc)  //groupByKey案例
   reduceBykeyTransformation(sc)  //reduceBykey案例
     joinTransformation(sc)          //join案例
      cogroupTransformation(sc)
    sc.stop()    //停止SparkContext,销毁相关的Driver
  }

  def sparkContext(name:String)={
    val conf = new SparkConf().setAppName("ggg").setMaster("local")
    val sc = new SparkContext(conf) //创建SparkContent,第一个RDD创建的唯一入口,也是Driver的灵魂,也是通往集群的唯一通道
    sc
  }

  def mapTransformation(sc:SparkContext): Unit ={
    val nums=sc.parallelize(1 to 10)    //根据集合创建RDD
    val mapped=nums.map(item => item*2) //map适用于任何元素,且对其作用的集合中的每一个元素循环遍历并调用其作为
                                         // 参数的函数对每一个遍历的元素进行具体化操作
    mapped.collect().foreach(println)  //收集计算结果并通过foreach循环打印
  }

  def filteredTransformation(sc:SparkContext): Unit ={
    val nums=sc.parallelize(1 to 20)
    val filtered=nums.filter(item => item%2==0)
    filtered.collect().foreach(println)  //收集计算结果并通过foreach循环打印
  }

  def faltmapTransformation(sc:SparkContext): Unit ={
    val bigData=Array("Scala Spark Java Hadoop","Java Tachyon")  //实例化字符串类型的Array
    val bigDataString=sc.parallelize(bigData)         //创建以字符串为元素类型的ParallelCollectionRDD
    val words=bigDataString.flatMap(line => line.split(" "))  //首先是通过传入的参数的函数来作用于RDD的每个字符串进行单词切分 合并成一个大的数据集Scala Spark Java Hadoop Java Tachyon
    words.collect().foreach(println)  //收集计算结果并通过foreach循环打印
  }

  def groupByKeyTransforamtion(sc: SparkContext): Unit ={
    val data=Array(Tuple2(100,"spark"),Tuple2(90,"Tachyon"),Tuple2(95,"scala"),Tuple2(90,"hadoop"),Tuple2(100,"java"))
    val dataRDD=sc.parallelize(data)
    val datas=dataRDD.groupByKey()   //对具有相同的键值分组
    datas.collect().foreach(println)  //收集计算结果并通过foreach循环打印
  }

  def reduceBykeyTransformation(sc:SparkContext): Unit ={
    val lines = sc.textFile("E:/test/test.txt",4) //读取本地文件,并设置为4个Partition
    val words=lines.flatMap(line => line.split(" "))
    //对每一行的字符串进行单词拆分,并把所有行的拆分结果通过flat合并成为一个大的单词集合
    val pairs = words.map(word => (word,1))
    //在单词拆分的基础上对每个单词实例计数为1
    val wordCounts = pairs.reduceByKey(_+_)
    //对相同的key,进行Value的累计(包括local和Reducer同时Reduce)
    val wordsort=wordCounts.map(wd =>(wd._2,wd._1)).sortByKey(false).map(wd =>(wd._2,wd._1))
    //对单词出现频率进行排序
    wordCounts.foreach(wd => println(wd._1 + ":" + wd._2))
    wordsort.foreach(wd => println(wd._1+":"+wd._2))
  }

  def joinTransformation(sc:SparkContext): Unit ={
    val studentNames=Array(Tuple2(1,"Spark"), Tuple2(2,"Tachyon"), Tuple2(3,"Hadoop"))
    val studentScores=Array(Tuple2(1,100), Tuple2(2,95), Tuple2(3,65),Tuple2(4,56))
    val names=sc.parallelize(studentNames)
    val scores=sc.parallelize(studentScores)
    val student=names.join(scores)   //rightOuterJoin,leftOuterJoin
    student.collect().foreach(println)
  }

  def cogroupTransformation(sc: SparkContext): Unit = {
    val studentNames=Array(Tuple2(1,"Spark"), Tuple2(2,"Tachyon"), Tuple2(3,"Hadoop"))
    val studentScores=Array(Tuple2(1,100), Tuple2(2,95), Tuple2(3,92),Tuple2(1,86),Tuple2(3,90),Tuple2(1,85))
    val names=sc.parallelize(studentNames)
    val scores=sc.parallelize(studentScores)
    val student=names.cogroup(scores)
    student.collect().foreach(item => println("ID:  "+item._1+"   Name:  "+item._2._1+"   Score:  "+item._2._2))
  }

}

学习于:
DT大数据梦工厂
新浪微博:www.weibo.com/ilovepains/
微信公众号:DT_Spark
博客:http://.blog.sina.com.cn/ilovepains
TEL:18610086859
Email:18610086859@vip.126.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值