常用的算子

package com.shujia.core

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

object Demo04FlatMap {
  def main(args: Array[String]): Unit = {
    //创建Spark Context
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo04FlatMap")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    val lineRDD: RDD[String] = sc.parallelize(List("hadoop,hive,hbase", "mapreduce,spark,flink", "hadoop,hive,hbase", "mapreduce,spark,flink"))

    /**
     * flatMap 转换算子
     * 同map算子类似 需要接收一个函数f
     * 会将RDD中的每一条数据传给函数f
     * 函数f处理之后必须返回一个可以遍历的类型
     * 最终flatMap会将函数f返回的结果进行展开(扁平化处理)
     */
    lineRDD
      .flatMap(line=>line.split(","))
      .foreach(println)

  }

}

hadoop
hive
hbase
mapreduce
spark
flink
hadoop
hive
hbase
mapreduce
spark
flink

package com.shujia.core

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

object Demo05GroupBy {
  def main(args: Array[String]): Unit = {
    //创建Spark Context
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo05GroupBy")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    val lineRDD: RDD[String] = sc.parallelize(List("hadoop,hive,hbase", "mapreduce,spark,flink", "hadoop,hive,hbase", "mapreduce,spark,flink"))

    //统计每个单词的数量
    val wordsRDD: RDD[String] = lineRDD
      .flatMap(line => line.split(","))

    //分组
    /**
     * groupBy 转换算子
     * 同List中的groupBy方法类似
     * 需要指定一个分组字段
     * 最终会返回一个RDD 不像List中的groupBy会返回一个Map
     * 但RDD中每条数据的类型也是一个二元组(可以看成kv格式)
     * "Key"指定的分组字段
     * “value”属于同一个分组的所有的数据
     */
    val groupRDD: RDD[(String, Iterable[String])] = wordsRDD
      .groupBy(word => word)

    groupRDD
      .map(kv=>s"${kv._1},${kv._2.size}")
      .foreach(println)
  }
}

spark,2
hive,2
hadoop,2
mapreduce,2
flink,2
hbase,2

package com.shujia.core

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

object Demo06Filter {
  def main(args: Array[String]): Unit = {
    //创建Spark Context
    val conf: SparkConf = new SparkConf()
    conf.setAppName(" Demo06Filter")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    //构建RDD 通过Scala中的集合构建
    val intRDD: RDD[Int] = sc.parallelize(List(1,2,3,4,5,6,7))

    //将RDD中的所有的奇数过滤出来
    /**
     * filter 转换算子
     * 可以实现对RDD中的数据进行过滤
     * 需要一个函数f
     * 函数f的返回值必须是Boolean类型
     * 如果为true 则保留数据
     * 如果为false 则过滤数据
     */
    val filterRDD: RDD[Int] = intRDD
//      .filter(i => {
//        if (i % 2 == 1) {
//          true
//        } else {
//          false
//        }
//      })
    //简写
      .filter(_%2==1)

    filterRDD.foreach(println)
  }
}

1
3
5
7

package com.shujia.core

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

object Demo07SortBy {
  def main(args: Array[String]): Unit = {
    //创建Spark Context
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo07SortBy")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    //构建RDD 通过Scala中的集合构建
    val intRDD: RDD[Int] = sc.parallelize(List(1,3,7,6,5,4,2,8,0,9))

    //对RDD中的数据进行降序排列
    /**
     * sortBy 转换算子
     * 指定一个字段进行排序
     * 可以通过ascending参数控制升序/降序排列
     */
    intRDD
      .sortBy(i => i,ascending = false)
      .foreach(println)

    intRDD
      .sortBy(i => -i)
      .foreach(println)
  }
}

9
8
7
6
5
4
3
2
1
0
 

9
8
7
6
5
4
3
2
1
0

package com.shujia.core

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

object Demo08Sample {
  def main(args: Array[String]): Unit = {

    //抽样
    //创建Spark Context
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo08Sample")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    val stuRDD: RDD[String] = sc.textFile("Spark/data/students.txt")

    /**
     * sample 转换算子 可以对数据进行抽样
     * 参数:
     * withReplacement 布尔值 表示有无放回
     * fraction 抽取数据的比例 因为是随机抽取 所以比例只是大概 不会精确
     * seed 随机数种子(
     * 如果需要让每一次抽样的结果都一致则可以设置为固定的值
     * 如果需要让每一次抽样的结果都不一致则可以设置为随机值)
     */
    val sampleRDD: RDD[String] = stuRDD
      .sample(withReplacement = false, fraction = 0.01, seed = 1)

    sampleRDD.foreach(println)
  }

}

1500100110,牛晨朗,22,男,文科六班
1500100137,宣向山,22,女,理科四班
1500100196,汤浩博,21,男,文科三班
1500100231,桂痴安,22,女,文科三班
1500100283,侯千风,24,女,文科三班
1500100456,鄂运凯,24,男,文科一班
1500100483,邵海阳,21,男,理科六班
1500100721,钱泽雨,23,男,理科三班
1500100783,弓浩言,21,男,理科四班
1500100944,查振国,22,男,理科四班
1500100972,王昂杰,23,男,理科二班

package com.shujia.core

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

object Demo09Union {
  def main(args: Array[String]): Unit = {
    //创建Spark Context
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo09Union")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    val stuRDD: RDD[String] = sc.textFile("Spark/data/students.txt")

    // getNumPartitions 返回RDD中的分区数量 它不是算子 只是RDD的一个属性
    println(s"stuRDD的分区数为:${stuRDD.getNumPartitions}")

    val sampleRDD1 = stuRDD
      .sample(withReplacement = false, fraction = 0.01, seed = 2)
    println(s"sampleRDD1的分区数为:${sampleRDD1.getNumPartitions}")

    val sampleRDD2 = stuRDD
      .sample(withReplacement = false, fraction = 0.01, seed = 2)
    println(s"sampleRDD2的分区数为:${sampleRDD2.getNumPartitions}")

    //RDD与RDD之间可以通过union进行合并
    /**
     * union 转换算子
     * 可以将两个RDD进行合并
     * 两个RDD的结构必须保存一致
     */
    val unionRDD: RDD[String] = sampleRDD1.union(sampleRDD2)
    println(s"unionRDD的分区数为:${unionRDD.getNumPartitions}")

    unionRDD.foreach(println)

    while(true){

    }
  }
}

stuRDD的分区数为:1
sampleRDD1的分区数为:1
sampleRDD2的分区数为:1
unionRDD的分区数为:2

1500100021,连鸿晖,22,男,理科六班
1500100084,应景平,22,男,理科三班
1500100220,向安寒,24,女,文科五班
1500100242,舒智阳,21,男,理科六班
1500100289,荆瀚钰,24,男,理科四班
1500100314,符南莲,24,女,文科一班
1500100329,秦又绿,23,女,文科四班
1500100465,倪鸿朗,24,男,理科四班
1500100471,钟冰真,21,女,文科三班
1500100504,时傲旋,23,女,理科六班
1500100530,强昊然,22,男,理科五班
1500100685,施昆颉,23,男,文科一班
1500100706,路曜坤,23,男,文科四班
1500100783,弓浩言,21,男,理科四班
1500100804,巴巧兰,24,女,文科四班
1500100910,孔沛槐,21,女,文科三班
1500100915,仲铭晨,22,男,理科一班

1500100021,连鸿晖,22,男,理科六班
1500100084,应景平,22,男,理科三班
1500100220,向安寒,24,女,文科五班
1500100242,舒智阳,21,男,理科六班
1500100289,荆瀚钰,24,男,理科四班
1500100314,符南莲,24,女,文科一班
1500100329,秦又绿,23,女,文科四班
1500100465,倪鸿朗,24,男,理科四班
1500100471,钟冰真,21,女,文科三班
1500100504,时傲旋,23,女,理科六班
1500100530,强昊然,22,男,理科五班
1500100685,施昆颉,23,男,文科一班
1500100706,路曜坤,23,男,文科四班
1500100783,弓浩言,21,男,理科四班
1500100804,巴巧兰,24,女,文科四班
1500100910,孔沛槐,21,女,文科三班
1500100915,仲铭晨,22,男,理科一班

package com.shujia.core

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

object Demo09Union {
  def main(args: Array[String]): Unit = {
    //创建Spark Context
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo09Union")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)
    /**
     * RDD的分区数量由什么决定?
     * 1.默认情况下子RDD的分区数等于父RDD的分区数
     * 2.如果是处理HDFS的数据 第一个RDD的分区数等于“切片”的数量
     * 3.如果是shuffle类算子 则可以手动指定分区数
     */

    val stuRDD: RDD[String] = sc.textFile("Spark/data/students.txt")

    // getNumPartitions 返回RDD中的分区数量 它不是算子 只是RDD的一个属性
    println(s"stuRDD的分区数为:${stuRDD.getNumPartitions}")

    val sampleRDD1 = stuRDD
      .sample(withReplacement = false, fraction = 0.1)
    println(s"sampleRDD1的分区数为:${sampleRDD1.getNumPartitions}")

    val sampleRDD2 = stuRDD
      .sample(withReplacement = false, fraction = 0.1)
    println(s"sampleRDD2的分区数为:${sampleRDD2.getNumPartitions}")

    //RDD与RDD之间可以通过union进行合并
    /**
     * union 转换算子
     * 可以将两个RDD进行合并
     * 两个RDD的结构必须保存一致
     * 新RDD的分区数等于两个RDD的分区数量之和
     */
    val unionRDD: RDD[String] = sampleRDD1.union(sampleRDD2)
    println(s"unionRDD的分区数为:${unionRDD.getNumPartitions}")

    unionRDD.foreach(println)

    //统计性别人数
    val groupRDD: RDD[(String, Iterable[String])] = unionRDD
      .groupBy(line => line.split(",")(3))
    println(s"groupRDD的分区数为:${groupRDD.getNumPartitions}")

    val genderCntRDD: RDD[String] = groupRDD
      .map(kv => s"${kv._1},${kv._2.size}")
    println(s"genderCntRDD的分区数为:${genderCntRDD.getNumPartitions}")

    genderCntRDD.foreach(println)

    //统计性别人数 手动给groupBy算子 指定分区数
    val groupRDD2: RDD[(String, Iterable[String])] = unionRDD
      .groupBy((line:String) => line.split(",")(3),8)
    println(s"groupRDD2的分区数为:${groupRDD2.getNumPartitions}")

    val genderCntRDD2: RDD[String] = groupRDD
      .map(kv => s"${kv._1},${kv._2.size}")
    println(s"genderCntRDD2的分区数为:${genderCntRDD2.getNumPartitions}")

    genderCntRDD.foreach(println)

    while(true){

    }
  }
}

stuRDD的分区数为:1
sampleRDD1的分区数为:1
sampleRDD2的分区数为:1
unionRDD的分区数为:2


1500100010,羿彦昌,23,男,理科六班
1500100020,杭振凯,23,男,理科四班
1500100026,向鹏池,21,男,理科四班
1500100035,包瀚玥,24,男,理科四班
1500100037,顾向松,22,女,文科一班
1500100045,仇运晟,21,男,理科一班
1500100049,籍涵煦,21,男,理科六班
1500100074,史鹏煊,22,男,理科六班
1500100101,计又琴,23,女,文科一班
1500100107,能昆明,23,男,理科五班
1500100115,益耘豪,24,男,理科四班
1500100120,桓浩邈,24,男,文科三班
1500100128,巫鸿哲,24,男,文科一班
1500100129,容寄南,23,女,文科三班
1500100138,栾鸿信,22,男,文科二班
1500100145,殴飞昂,24,男,理科五班
1500100153,孔涵蕾,21,女,文科四班
1500100160,云冰真,24,女,文科三班
1500100164,封昂杰,21,男,理科六班
1500100166,车怀曼,24,女,文科四班
1500100174,茅香薇,22,女,理科六班
1500100176,施元容,21,女,文科六班
1500100178,杜芷天,21,女,文科一班
1500100184,夔寻巧,24,女,理科三班
1500100186,昌元冬,22,女,文科五班
1500100220,向安寒,24,女,文科五班
1500100221,费智伟,23,男,理科六班
1500100228,孙鑫鹏,22,男,理科六班
1500100233,师昆鹏,24,男,理科六班
1500100248,盛学智,23,男,文科二班
1500100250,敖景明,23,男,文科五班
1500100252,巴向薇,23,女,理科六班
1500100265,融寻桃,21,女,文科四班
1500100271,龙浩初,21,男,理科六班
1500100272,蔡起运,23,男,文科四班
1500100275,关昆皓,23,男,文科三班
1500100283,侯千风,24,女,文科三班
1500100289,荆瀚钰,24,男,理科四班
1500100305,鞠访烟,22,女,理科四班
1500100317,范盼菡,21,女,理科六班
1500100323,周德昌,24,男,理科一班
1500100327,阴昌翰,24,男,理科二班
1500100333,乐绮烟,22,女,文科一班
1500100362,元巧兰,21,女,理科五班
1500100372,彭运恒,24,男,文科四班
1500100382,左涵蓄,22,男,理科四班
1500100385,潘忆之,23,女,文科一班
1500100386,王丹蝶,21,女,文科二班
1500100395,张迎荷,23,女,文科六班
1500100397,能谷槐,24,女,理科五班
1500100402,利浦和,24,男,理科二班
1500100407,束昊磊,21,男,文科一班
1500100419,戈半双,23,女,理科一班
1500100431,訾寄南,23,女,文科五班
1500100435,殴紫萱,23,女,理科五班
1500100438,宋向南,22,女,文科六班
1500100440,梅金鹏,22,男,文科六班
1500100450,仲彦昌,21,男,文科三班
1500100452,辛青旋,23,女,理科二班
1500100459,阮依波,23,女,文科二班
1500100472,萧香巧,21,女,理科二班
1500100483,邵海阳,21,男,理科六班
1500100489,顾冷霜,22,女,理科二班
1500100494,邢运良,23,男,理科六班
1500100506,相思菱,22,女,理科五班
1500100514,乐震博,22,男,文科五班
1500100517,常景天,24,男,文科二班
1500100522,干高旻,21,男,文科五班
1500100533,隆梦秋,22,女,文科二班
1500100535,简昆纶,23,男,文科二班
1500100539,莫高朗,21,男,文科四班
1500100550,温若云,23,女,理科一班
1500100553,晁旭鹏,21,男,理科二班
1500100554,饶天蓉,24,女,文科二班
1500100571,向星泽,24,男,文科六班
1500100600,侯鸿晖,22,男,理科四班
1500100603,鲁盼菡,21,女,理科五班
1500100612,简念瑶,22,女,文科六班
1500100618,夏夜山,24,女,文科六班
1500100620,咸鸿轩,22,男,理科三班
1500100621,娄依云,21,女,文科三班
1500100627,柏念波,21,女,文科五班
1500100643,谷旭炎,22,男,文科六班
1500100655,贺青易,22,女,文科六班
1500100679,尹耘涛,24,男,理科四班
1500100686,郜旭彬,23,男,文科三班
1500100691,闻运鸿,22,男,理科一班
1500100694,訾海瑶,23,女,文科五班
1500100701,林觅云,24,女,文科六班
1500100703,勾翠彤,22,女,文科五班
1500100710,岑瀚钰,23,男,文科三班
1500100722,禹昆明,23,男,理科三班
1500100728,龚晗昱,21,男,文科三班
1500100731,路涵蓄,24,男,理科二班
1500100765,郗景行,24,男,文科五班
1500100775,明映雁,22,女,文科二班
1500100777,易新曦,23,男,文科五班
1500100790,沙慕易,23,女,文科二班
1500100794,苏觅云,24,女,文科二班
1500100800,终飞昂,21,男,文科三班
1500100818,谢德泽,24,男,文科六班
1500100825,丁震轩,21,男,文科二班
1500100826,满辰钊,22,男,文科三班
1500100832,蓟芷梦,21,女,文科四班
1500100851,白运盛,22,男,理科六班
1500100862,茹晨朗,22,男,理科六班
1500100868,勾书雁,24,女,文科二班
1500100870,衡念蕾,23,女,理科三班
1500100880,张旭鹏,21,男,文科四班
1500100891,国元冬,23,女,文科六班
1500100916,范念薇,23,女,文科三班
1500100923,于从寒,23,女,理科二班
1500100927,濮恨蕊,23,女,文科三班
1500100936,习振锐,23,男,理科二班
1500100961,李昂熙,24,男,文科四班
1500100969,毛昆鹏,24,男,文科三班
1500100978,郜昆卉,21,男,文科五班
1500100987,双昆杰,24,男,文科四班

1500100015,宦怀绿,21,女,理科一班
1500100019,娄曦之,24,男,理科三班
1500100022,薄运珧,23,男,文科四班
1500100031,麻智刚,24,男,文科六班
1500100033,桑昆峰,24,男,理科三班
1500100042,麻旭尧,24,男,文科四班
1500100051,江寄容,24,女,文科五班
1500100070,濮佑运,22,男,理科一班
1500100077,钮元蝶,24,女,理科三班
1500100082,凌思菱,22,女,文科一班
1500100087,童鸿禧,23,男,理科五班
1500100088,田德明,21,男,文科三班
1500100124,冯绿蝶,22,女,理科四班
1500100148,蒋震博,23,男,文科六班
1500100167,裘昌淼,23,男,理科六班
1500100175,邰凡灵,21,女,理科一班
1500100181,巩怀莲,24,女,理科四班
1500100183,卫若枫,24,女,理科六班
1500100192,暨君昊,21,男,文科二班
1500100198,于景行,21,男,理科四班
1500100205,池景明,24,男,理科六班
1500100212,单旭鹏,23,男,理科二班
1500100224,裴昂熙,24,男,理科六班
1500100240,车惜玉,23,女,理科三班
1500100241,石怀绿,21,女,文科四班
1500100262,黎盼烟,23,女,理科六班
1500100314,符南莲,24,女,文科一班
1500100340,濮昆纬,24,男,理科五班
1500100341,闵惜萍,24,女,文科六班
1500100376,庾胤运,21,男,文科一班
1500100400,符寄风,23,女,文科二班
1500100407,束昊磊,21,男,文科一班
1500100410,羿芷卉,21,女,理科一班
1500100426,双辰皓,22,男,理科一班
1500100431,訾寄南,23,女,文科五班
1500100440,梅金鹏,22,男,文科六班
1500100457,那鸿羲,23,男,文科四班
1500100466,卞代萱,22,女,理科五班
1500100468,司凡雁,21,女,文科六班
1500100491,富香薇,23,女,理科四班
1500100494,邢运良,23,男,理科六班
1500100504,时傲旋,23,女,理科六班
1500100511,全景行,23,男,文科六班
1500100518,乔思萱,24,女,理科二班
1500100520,路曜灿,22,男,文科四班
1500100525,辛宣朗,21,男,文科四班
1500100542,邴鸿骞,23,男,理科六班
1500100547,廖向南,22,女,理科五班
1500100552,穆凌青,22,女,文科三班
1500100561,时昂雄,22,男,理科五班
1500100569,甘振博,23,男,文科五班
1500100575,张恨桃,24,女,理科五班
1500100581,邢鸿畴,21,男,文科二班
1500100584,蔡昊天,23,男,理科六班
1500100594,凌运华,22,男,文科四班
1500100604,纪瀚昂,24,男,文科五班
1500100611,彭浩波,22,男,理科四班
1500100613,胥语梦,22,女,理科三班
1500100619,水夜山,22,女,理科一班
1500100622,蓬慕卉,21,女,文科五班
1500100627,柏念波,21,女,文科五班
1500100643,谷旭炎,22,男,文科六班
1500100655,贺青易,22,女,文科六班
1500100658,习昂杰,22,男,文科六班
1500100675,禹依秋,23,女,理科二班
1500100681,步昌翰,24,男,文科三班
1500100684,卜若枫,24,女,理科二班
1500100703,勾翠彤,22,女,文科五班
1500100719,羿半梅,21,女,理科四班
1500100725,董运珧,24,男,理科五班
1500100727,霍昊英,21,男,理科三班
1500100737,奚俊晖,21,男,理科四班
1500100751,裘哲瀚,22,男,文科六班
1500100763,鄂笑容,21,女,文科一班
1500100769,幸映安,24,女,文科六班
1500100778,寇怀寒,24,女,文科一班
1500100782,罗静珊,22,女,文科六班
1500100786,麴妙绿,24,女,理科一班
1500100798,蔡晨朗,24,男,文科三班
1500100822,满君昊,22,男,理科四班
1500100826,满辰钊,22,男,文科三班
1500100830,夔宛秋,21,女,文科二班
1500100836,邵香巧,22,女,理科三班
1500100843,管鸿达,21,男,文科五班
1500100845,符依云,22,女,文科六班
1500100854,利敬曦,23,男,文科二班
1500100863,曹念蕾,22,女,文科一班
1500100864,柯凡雁,22,女,理科六班
1500100875,马向南,21,女,文科一班
1500100890,郁昊苍,21,男,文科二班
1500100908,那光济,22,男,文科二班
1500100934,隆高旻,21,男,理科五班
1500100942,贡涵亮,21,男,理科六班
1500100959,金醉波,23,女,理科四班
1500100960,乔旭尧,21,男,文科三班
1500100989,柏盼香,24,女,理科六班
1500100999,钟绮晴,23,女,文科五班

groupRDD的分区数为:2
genderCntRDD的分区数为:2


groupRDD2的分区数为:8
genderCntRDD2的分区数为:2

男,114
女,101

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值