Spark—RDD编程常用转换算子代码实例

Spark rdd 常用 Transformation 实例:

1、def map[U: ClassTag](f: T => U): RDD[U]   将函数应用于RDD的每一元素,并返回一个新的RDD

package top.ruandb
import org.apache.spark.{SparkConf, SparkContext}
object RddTest extends App{
val sparkConf = new SparkConf().setAppName("RddTest").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
//map
var source = sc.parallelize(1 to 10)
source.collect().foreach(e=>print(e+","))//1 2 3 4 5 6 7 8 9 10
var sourceMap = source.map(_*10)
sourceMap.collect().foreach(e=>print(e+","))//10 20 30 40 50 60 70 80 90 100
}

2、def filter(f: T => Boolean): RDD[T] 通过提供的产生boolean条件的表达式来返回符合结果为True新的RDD

//filter
var source = sc.parallelize(1 to 10)
source.collect().foreach(e=>print(e+" "))//1 2 3 4 5 6 7 8 9 10
var sourceMap = source.filter(_.<(5))
sourceMap.collect().foreach(e=>print(e+" "))//1 2 3 4

3、def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U]   将函数应用于RDD中的每一项,对于每一项都产生一个集合,并将集合中的元素压扁成一个集合。

//flatMap
var source = sc.parallelize(1 to 5)
source.collect().foreach(e=>print(e+" "))//1 2 3 4 5
var sourceMap = source.flatMap(x=>(1 to x))
sourceMap.collect().foreach(e=>print(e+" "))//1 1 2 1 2 3 1 2 3 4 1 2 3 4 5

4、def mapPartitions[U: ClassTag]( f: Iterator[T] => Iterator[U], preservesPartitioning: Boolean = false): RDD[U]    将函数应用于RDD的每一个分区,每一个分区运行一次,函数需要能够接受Iterator类型,然后返回Iterator。

package top.ruandb
import org.apache.spark.{SparkConf, SparkContext}
object RddTest {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("RddTest").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
//mapPartitions
var source = sc.parallelize(List(("lucy", "female"), ("jack", "male"), ("jams", "male")))
source.collect().foreach(e => print(e + " "))//(lucy,female) (jack,male) (jams,male)
var sourceMap = source.mapPartitions(partitionsFun)
sourceMap.collect().foreach(e => print(e + " ")) //jams jack
}
def partitionsFun(iter:Iterator[(String,String)]): Iterator[String] ={
var males = List[String]()
while(iter.hasNext){
val next = iter.next()
next match {
case (_,"male") => males = next._1::males
case _ =>
}
}
return males.iterator
}
}

5、def mapPartitionsWithIndex[U: ClassTag]( f: (Int, Iterator[T]) => Iterator[U], preservesPartitioning: Boolean = false): RDD[U]  将函数应用于RDD中的每一个分区,每一个分区运行一次,函数能够接受 一个分区的索引值 和一个代表分区内所有数据的Iterator类型,需要返回Iterator类型。

package top.ruandb
import org.apache.spark.{SparkConf, SparkContext}
object RddTest {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("RddTest").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
//mapPartitionsWithIndex
var source = sc.parallelize(List(("lucy", "female"), ("jack", "male"), ("jams", "male")))
source.collect().foreach(e => print(e + " "))//(lucy,female) (jack,male) (jams,male)
var sourceMap = source.mapPartitionsWithIndex(partitionsFunWithIndex)
sourceMap.collect().foreach(e => print(e + " ")) //[1]jams [1]jack
}
def partitionsFunWithIndex(index:Int,iter:Iterator[(String,String)]): Iterator[String] ={
var males = List[String]()
while(iter.hasNext){
val next = iter.next()
next match {
case (_,"male") => males="["+index+"]"+next._1 :: males
case _ =>
}
}
males.iterator
}
}

6、def sample(withReplacement: Boolean, fraction: Double, seed: Long = Utils.random.nextLong): RDD[T] 在RDD中移seed为种子返回大致上有fraction比例个数据样本RDD,withReplacement表示是否采用放回式抽样。

package top.ruandb
import org.apache.spark.{SparkConf, SparkContext}
object RddTest {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("RddTest").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
//sample
var source = sc.parallelize(1 to 10)
source.collect().foreach(e => print(e + " "))//1 2 3 4 5 6 7 8 9 10
var sourceMap = source.sample(true,0.4,2)
sourceMap.collect().foreach(e => print(e + " ")) //1 2 2
}
}

7、def union(other: RDD[T]): RDD[T]  将两个RDD中的元素进行合并,返回一个新的RDD

//union
var source = sc.parallelize(1 to 3)
source.collect().foreach(e => print(e + " "))//1 2 3
var rdd = sc.parallelize(6 to 9)
var sourceMap = source.union(rdd)
sourceMap.collect().foreach(e => print(e + " "))//1 2 3 6 7 8 9

8、def intersection(other: RDD[T]): RDD[T]  将两个RDD做交集,返回一个新的RDD

//intersection
var source = sc.parallelize(1 to 8)
source.collect().foreach(e => print(e + " "))//1 2 3 4 5 6 7 8
var rdd = sc.parallelize(6 to 9)
var sourceMap = source.intersection(rdd)
sourceMap.collect().foreach(e => print(e + " "))//6 8 7

9、def distinct(): RDD[T]  将当前RDD进行去重后,返回一个新的RDD

//distinct
var source = sc.parallelize(List(1,1,2,2,3,3,4,4,5,5))
source.collect().foreach(e => print(e + " "))//1 1 2 2 3 3 4 4 5 5
var sourceMap = source.distinct()
sourceMap.collect().foreach(e => print(e + " "))//4 2 1 3 5

10、def partitionBy(partitioner: Partitioner): RDD[(K, V)]  根据设置的分区器重新将RDD进行分区,返回新的RDD

//partitionBy
var source = sc.parallelize(List((1,"111"),(2,"222"),(3,"333"),(4,"444")),4)
source.collect().foreach(e => print(e + " "))
print("分区数:"+source.partitions.size)//(1,111) (2,222) (3,333) (4,444) 分区数:4
var sourceMap = source.partitionBy(new HashPartitioner(2))
sourceMap.collect().foreach(e => print(e + " "))
print("分区数:"+sourceMap.partitions.size)//(2,222) (4,444) (1,111) (3,333) 分区数:2

11、def reduceByKey(func: (V, V) => V): RDD[(K, V)]   根据Key值将相同Key的元组的值用func进行计算,返回新的RDD

//reduceByKey
var source = sc.parallelize(List(("hello",1),("world",1),("hello",1),("world",1)))
source.collect().foreach(e => print(e + " "))//(hello,1) (world,1) (hello,1) (world,1)
var sourceMap = source.reduceByKey((x,y)=>x+y)
sourceMap.collect().foreach(e => print(e + " "))//(hello,2) (world,2)

12、def groupByKey(): RDD[(K, Iterable[V])]   将相同Key的值进行聚集,输出一个(K, Iterable[V])类型的RDD

//groupByKey
var source = sc.parallelize(List(("hello",1),("world",1),("hello",1),("world",1)))
source.collect().foreach(e => print(e + " "))//(hello,1) (world,1) (hello,1) (world,1)
var sourceMap = source.groupByKey()
sourceMap.collect().foreach(e => print(e + " "))//(hello,CompactBuffer(1, 1)) (world,CompactBuffer(1, 1))

13、def combineByKey[C](createCombiner: V => C, mergeValue: (C, V) => C, mergeCombiners: (C, C) => C, numPartitions: Int): RDD[(K, C)]   根据key分别使用CreateCombiner和mergeValue进行相同key的数值聚集,通过mergeCombiners将各个分区最终的结果进行聚集。

package top.ruandb
import org.apache.spark.{ SparkConf, SparkContext}
object RddTest {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("RddTest").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
//combineByKey 计算平均成绩
var scores = Array(("lucy", 89), ("jack", 77), ("lucy", 100), ("james", 65), ("jack", 99),
("james", 44))
var input = sc.parallelize(scores);
input.collect().foreach(e => print(e + " "))
//(lucy,89) (jack,77) (lucy,100) (james,65) (jack,99) (james,44)
var output = input.combineByKey((v) => (v, 1),
(acc: (Int, Int), v) => (acc._1 + v, acc._2 + 1),
(acc1: (Int, Int), acc2: (Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2))
output.collect().foreach(e => print(e + " "))//(james,(109,2)) (jack,(176,2)) (lucy,(189,2))
var result = output.map{case (key,value) => (key,value._1/value._2.toDouble)}
result.collect().foreach(e => print(e + " "))//(james,54.5) (jack,88.0) (lucy,94.5)
}
}

14、def aggregateByKey[U: ClassTag](zeroValue: U, partitioner: Partitioner)(seqOp: (U, V) => U,

combOp: (U, U) => U): RDD[(K, U)]   通过seqOp函数将每一个分区里面的数据和初始值迭代带入函数返回最终值,comOp将每一个分区返回的最终值根据key进行合并操作。

Spark—RDD编程常用转换算子代码实例的更多相关文章

  1. Spark RDD编程核心

    一句话说,在Spark中对数据的操作其实就是对RDD的操作,而对RDD的操作不外乎创建.转换.调用求值. 什么是RDD RDD(Resilient Distributed Dataset),弹性分布式 ...

  2. spark RDD编程,scala版本

    1.RDD介绍:     RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...

  3. Spark RDD编程-大数据课设

    目录 一.实验目的 二.实验平台 三.实验内容.要求 1.pyspark交互式编程 2.编写独立应用程序实现数据去重 3.编写独立应用程序实现求平均值问题 四.实验过程 (一)pyspark交互式编程 ...

  4. Spark基础:(二)Spark RDD编程

    1.RDD基础 Spark中的RDD就是一个不可变的分布式对象集合.每个RDD都被分为多个分区,这些分区运行在分区的不同节点上. 用户可以通过两种方式创建RDD: (1)读取外部数据集====> ...

  5. Spark RDD编程(博客索引,日常更新)

    本篇主要是记录自己在中解决RDD编程性能问题中查阅的论文博客,为我认为写的不错的建立索引方便查阅,我的总结会另立他篇 1)通过分区(Partitioning)提高spark性能https://blog ...

  6. Spark RDD Tutorial

    Spark RDD教程 这个教程将会帮助你理解和使用Apache Spark RDD.所有的在这个教程中使用的RDD例子将会提供在github上,供大家快速的浏览. 什么是RDD(Rssilient ...

  7. spark 学习_rdd常用操作

    [spark API 函数讲解 详细 ]https://www.iteblog.com/archives/1399#reduceByKey [重要API接口,全面 ] http://spark.apa ...

  8. Spark(四)【RDD编程算子】

    目录 测试准备 一.Value类型转换算子 map(func) mapPartitions(func) mapPartitions和map的区别 mapPartitionsWithIndex(func ...

  9. Spark菜鸟学习营Day1 从Java到RDD编程

    Spark菜鸟学习营Day1 从Java到RDD编程 菜鸟训练营主要的目标是帮助大家从零开始,初步掌握Spark程序的开发. Spark的编程模型是一步一步发展过来的,今天主要带大家走一下这段路,让我 ...

随机推荐

  1. TensorFlow基础剖析

    TensorFlow基础剖析 一.概述 TensorFlow 是一个使用数据流图 (Dataflow Graph) 表达数值计算的开源软件库.它使 用节点表示抽象的数学计算,并使用 OP 表达计算的逻 ...

  2. 『心善渊』Selenium3.0基础 — 1、Selenium自动化测试框架介绍

    目录 1.Selenium介绍 2.Selenium的特点 3.Selenium版本说明 4.拓展:WebDriver与Selenium RC的区别 5.Webdriver工作原理 1.Seleniu ...

  3. spring + spring mvc + tomcat 面试题(史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  4. CMD批处理(1)——批处理常用命令总结

    echo 打开回显或关闭回显功能,或显示消息.如果没有任何参数,echo命令将显示当前的回显设置. 命令格式1:echo [{on|off}] 命令格式2:echo [message]   例.在命令 ...

  5. XML从入门到深入(超详细)

    一:什么是XML XML (eXtensible Markup Language)指可扩展标记语言,标准通用标记语言的子集,简称XML.是一种用于标记电子文件使其具有结构性的标记语言. XML可以标记 ...

  6. org.junit.Assert(断言)

    org.junit.Assert(断言) Assert是断言的意思,可以理解为"猜测",如果猜测错误,则抛出java.lang.AssertionError异常.  引入jar包  ...

  7. STP协议与MSTP协议

    STP协议与MSTP协议 目录 一.STP概述 1.1.交换网络环路的产生 1.2.STP简介 二.生成树算法 2.1.生成树算法的步骤 2.2.网桥 ID 2.3.选择根端口 2.4.选择指定端口 ...

  8. WEB安全新玩法 [6] 防范图形验证码重复使用

    在完成关键业务操作时,要求用户输入图形验证码是防范自动化攻击的一种措施.为安全起见,即使针对同一用户,在重新输入信息时也应该更新图形验证码.iFlow 业务安全加固平台可以加强这方面的处理. 某网站系 ...

  9. excel VBA构造函数就是这么简单

    Function test(a As Integer)'构造函数名字为test参数为a且为int型  If a >= 90 Then     Debug.Print "优秀" ...

  10. Flannel和Calico网络插件对比

    1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...