spark 2.2.0学习笔记3之SparkRDDDemo

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/undergrowth/article/details/78868327

spark 2.2.0学习笔记3之SparkRDDDemo

Info

键值对RDD(pair RDD)—-用来进行聚合运算/元素为元组

  • reduceByKey—-通过key 进行操作—-返回新的rdd
  • groupByKey—-进行分组
  • mapValues/flatMapValues—-应用值
  • keys/values/sortByKey—-返回key value sort
  • join—-对两个rdd进行内连接
  • subtractByKey/rightOuterJoin/leftOuterJoin/cogroup

操作—-转换操作(转换操作返回的是RDD)与行动操作(行动操作返回的是其他类型)

  • trans—-由一个rdd生成另一个新的rdd/
    • map—-接收函数,应用到rdd每个元素,将函数的返回结果放入rdd
    • filter—-接收函数返回新的rdd,将满足函数的元素放入rdd
    • flatMap—-压扁,一行转多行,将返回的迭代器拍扁
    • 集合运算(rdd具有相同数据类型)—-
    • distinct(shuffle开销很大)/union(包含重复数据)/
    • intersection(shuffle去重)/subtract(shuffle)/cartesian(笛卡尔积/所有可能组合)
    • countByKey/lookup/collectAsMap
  • action—-对rdd计算结果—-返回结果给驱动程序或者保存到外部系统—-
    • reduce—-接收函数,操作两个rdd元素,返回同类型新元素
    • fold—-与reduce一致,但是需要初始值
    • aggregate(zeroValue)(seqOp, combOp)—-返回不同的数据类型
    • collect—-获取整个rdd数据
    • take—-返回n个结果 随机的
    • takeOrdered—-按照指定顺序返回
    • top—-排序后的top
    • takeSample—-从数据集获取采样
    • foreach—-计算元素 不返回本地
    • persist/unpersist—-持久化(可内存/磁盘)
    • count—-返回元素个数
    • countByValue—-各元素在rdd中出现次数
    • first—-

Code

package spark30.basic

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

/**
  * @description
  * @author zhangwu
  * @date 2017-11-07-21:48
  * @version 1.0.0
  */
object SparkRDDDemo {


  def demo_basic(lines: RDD[String], input: RDD[String]) = {
    println(lines)
    println(input)
    // 转换操作 转换数据集
    val errorRdd=input.filter(line=>line.contains("error"))
    val debugRdd=input.filter(line=>line.contains("debug"))
    val errorUnionDebug=errorRdd.union(debugRdd)
    println(errorRdd+"\t"+debugRdd+"\t"+errorUnionDebug)
    // 行为操作
    println("error info count:"+errorRdd.count()+"\t first error info is:"+errorRdd.first()+
      "\t debug info count:"+debugRdd.count()
      +"\t first debug info is:"+debugRdd.first())
    errorUnionDebug.take(2).foreach(println)
    println("random string")
    errorUnionDebug.take(2).foreach(println)
  }

  def demo_map(input2: RDD[Int]): Unit = {
    val result = input2.map(x => x * x)
    println(result.collect().mkString(","))
  }

  def demo_flatMap(input3: RDD[String]): Unit = {
    val words = input3.flatMap(line => line.split(" "))
    println(words.first()) // 返回"hello"
    words.foreach(println)
  }

  def demo_reduce(input2: RDD[Int]): Unit = {
    var sum=input2.reduce((x,y)=>x+y)
    println("sum is:"+sum)
  }

  def demo_aggregate(input2: RDD[Int]): Unit = {
    // aggregate(zeroValue)(seqOp, combOp)
    // 牛逼
    val result = input2.aggregate((0, 0))(
      (acc, value) => (acc._1 + value, acc._2 + 1),
      (acc1, acc2) => (acc1._1 + acc2._1, acc1._2 + acc2._2))
    val avg = result._1 / result._2.toDouble
    println(result._1+"\t"+result._2.toDouble+"\t"+avg)
  }

  def main(args: Array[String]) {
    // 获取SparkContext
    val sc = SparkContextUtil.getSparkContext(SparkRDDDemo.getClass.getCanonicalName)
    val inputFile="README.md"
    // 创建rdd 集合并行化
    val lines = sc.parallelize(List("pandas", "i like pandas"))
    // 创建rdd 读取外部数据集
    val input = sc.textFile(inputFile)
    demo_basic(lines,input)
    // map 演示
    val input2 = sc.parallelize(List(1, 2, 3, 4))
    demo_map(input2)
    val input3 = sc.parallelize(List("hello world", "hi"))
    demo_flatMap(input3)
    // reduce 演示
    demo_reduce(input2)
    // aggregate
    demo_aggregate(input2)
  }
}

Code

猜你喜欢

转载自blog.csdn.net/undergrowth/article/details/78868327
今日推荐