RDD用法
1. RDD转换算子
1.1 概述
- RDD根据数据处理方式的不同将算子整体上分为Value类型、双Value类型和Key-Value类型
1.2 map方法
-
函数签名
def map[U: ClassTag](f: T => U): RDD[U]
-
函数说明
- 将处理的数据逐条进行映射转换,这里的转换可以是类型的转换,也可以是值的转换。
-
用法
package com.gec.bigdata.spark.rdd.operator.transform import org.apache.spark.rdd.RDD import org.apache.spark.{ SparkConf, SparkContext} object Spark01_RDD_Oper_Transform { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[*]").setAppName("RDD") val sc = new SparkContext(conf) // TODO 算子 - 转换 - map val rdd = sc.makeRDD(List(1,2,3,4)) // map算子表示将数据源中的每一条数据进行处理 // map算子的参数是函数类型: Int => U(不确定) def mapFunction( num : Int ): Int = { num * 2 } // A => B //val rdd1: RDD[Int] = rdd.map(mapFunction) val rdd1: RDD[Int] = rdd.map(_ * 2) rdd1.collect().foreach(println) sc.stop() } }
1.3 mapPartitions方法
-
函数签名
def mapPartitions[U: ClassTag]( f: Iterator[T] => Iterator[U], preservesPartitioning: Boolean = false): RDD[U]
-
函数说明
- 将待处理的数据以分区为单位发送到计算节点进行处理,这里的处理是指可以进行任意的处理,哪怕是过滤数据。
package com.gec.bigdata.spark.rdd.operator.transform import org.apache.spark.rdd.RDD import org.apache.spark.{ SparkConf, SparkContext} object Spark02_RDD_Oper_Transform { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[*]").setAppName("RDD") val sc = new SparkContext(conf) // TODO 算子 - 转换 - val rdd = sc.makeRDD(List(1,2,3,4), 2) val rdd1 = rdd.mapPartitions( list => { println("*********************") list.map(_*2) } ) rdd1.collect().foreach(println) sc.stop() } }
-
小功能:获取每个数据分区的最大值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w0ka0mjo-1655396109919)(assets/clip_image002.jpg)] 思考一个问题:map和mapPartitions的区别?
数据处理角度
Map算子是分区内一个数据一个数据的执行,类似于串行操作。而mapPartitions算子是以分区为单位进行批处理操作。
功能的角度
Map算子主要目的将数据源中的数据进行转换和改变。但是不会减少或增多数据。MapPartitions算子需要传递一个迭代器,返回一个迭代器,没有要求的元素的个数保持不变,所以可以增加或减少数据 性能的角度
Map算子因为类似于串行操作,所以性能比较低,而是mapPartitions算子类似于批处理,所以性能较高。但是mapPartitions算子会长时间占用内存,那么这样会导致内存可能不够用,出现内存溢出的错误。所以在内存有限的情况下,不推荐使用。使用map操作。
完成比完美更重要
1.4 flatMap
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sIC4Ep2X-1655396109920)(assets/1652194680569.png)]
-
函数签名
def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U]
-
函数说明
-
将处理的数据进行扁平化后再进行映射处理,所以算子也称之为扁平映射
package com.gec.demo import org.apache.spark.rdd.RDD import org.apache.spark.{ SparkConf, SparkContext} object Spark_WordCount { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[*]").setAppName("RDD") val sc = new SparkContext(conf) // TODO 算子 - 转换 - 扁平化 val rdd = sc.makeRDD( List( "Hello Scala", "Hello Spark" ) ) val rdd1 = sc.makeRDD( List
-