Spark—RDD编程常用转换算子代码实例
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编程常用转换算子代码实例的更多相关文章
- Spark RDD编程核心
一句话说,在Spark中对数据的操作其实就是对RDD的操作,而对RDD的操作不外乎创建.转换.调用求值. 什么是RDD RDD(Resilient Distributed Dataset),弹性分布式 ...
- spark RDD编程,scala版本
1.RDD介绍: RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...
- Spark RDD编程-大数据课设
目录 一.实验目的 二.实验平台 三.实验内容.要求 1.pyspark交互式编程 2.编写独立应用程序实现数据去重 3.编写独立应用程序实现求平均值问题 四.实验过程 (一)pyspark交互式编程 ...
- Spark基础:(二)Spark RDD编程
1.RDD基础 Spark中的RDD就是一个不可变的分布式对象集合.每个RDD都被分为多个分区,这些分区运行在分区的不同节点上. 用户可以通过两种方式创建RDD: (1)读取外部数据集====> ...
- Spark RDD编程(博客索引,日常更新)
本篇主要是记录自己在中解决RDD编程性能问题中查阅的论文博客,为我认为写的不错的建立索引方便查阅,我的总结会另立他篇 1)通过分区(Partitioning)提高spark性能https://blog ...
- Spark RDD Tutorial
Spark RDD教程 这个教程将会帮助你理解和使用Apache Spark RDD.所有的在这个教程中使用的RDD例子将会提供在github上,供大家快速的浏览. 什么是RDD(Rssilient ...
- spark 学习_rdd常用操作
[spark API 函数讲解 详细 ]https://www.iteblog.com/archives/1399#reduceByKey [重要API接口,全面 ] http://spark.apa ...
- Spark(四)【RDD编程算子】
目录 测试准备 一.Value类型转换算子 map(func) mapPartitions(func) mapPartitions和map的区别 mapPartitionsWithIndex(func ...
- Spark菜鸟学习营Day1 从Java到RDD编程
Spark菜鸟学习营Day1 从Java到RDD编程 菜鸟训练营主要的目标是帮助大家从零开始,初步掌握Spark程序的开发. Spark的编程模型是一步一步发展过来的,今天主要带大家走一下这段路,让我 ...
随机推荐
- 图像实例分割:CenterMask
图像实例分割:CenterMask CenterMask: single shot instance segmentation with point representation 论文链家: http ...
- 自动调试用于移动GPU的卷积网络
自动调试用于移动GPU的卷积网络 对特定设备进行自动调试对于获得最佳性能至关重要.这是有关如何调试整个卷积网络的说明文档. TVM中Mobile GPU的算子实现以模板形式编写.模板具有许多可调旋钮( ...
- JVM中的堆的新生代、老年代、永久代详解
JVM中的堆一般分为三大部分:新生代.老年代.永久代,其大致的占比如下: 一.新生代 新生代主要用来存放新生的对象.一般占据堆空间的1/3.在新生代中,保存着大量的刚刚创建的对象,但是大部分的对象都 ...
- postman 获取Json 返回值的某个键值并进行断言判定
前提: 当前接口返回的结果值为json格式 1.将响应正文信息copy 到 https://www.bejson.com/ 便于查看 2.取值并进行断言编写 //json对象解析取值 var jd ...
- jemeter压测, 高级应用: 发1万个请求,每个请求参数都不同, 使用CSV数据文件配置
今天接到一个压测任务, 数据源需要自己从测试环境库中取, 并且使用jemeter 请求, 每个请求参数都不相同 这里使用jemeter的 CSV数据文件来配置: 这样配置好后, 开始发送请求: csv ...
- 反汇编EXE添加一个启动时的消息框
反汇编EXE添加一个启动时的消息框 最近有一个要修改PE文件的需求,就先从EXE文件下手吧,我也是初学一个小时而已,不过之前接触过一点汇编罢了,这篇文章算是个DEMO,主要的思路是将其反汇编得到汇编代 ...
- RF中在测试用例集上设置标签
1.有时候我们在执行测试用例时只想执行部分测试用例集下面的测试用例,这时可以在相应的测试用例集中设置标签,然后运行时选择标签执行对应的测试用例 语法: *** Settings *** Force T ...
- 终于放弃了单调的swagger-ui了,选择了这款神器—knife4j
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案(在非Java项目中也提供了前端UI的增强解决方案),前身是swagger-bootstrap-ui,取名knife ...
- 01 . Varnish简介,原理,配置缓存
简介 Varnish是高性能开源的反向代理服务器和HTTP缓存服务器,其功能与Squid服务器相似,都可以用来做HTTP缓存.可以安装 varnish 在任何web前端,同时配置它缓存内容.与传统的 ...
- 可编程网络DataPath 及XDP
目录 可编程网络DataPath XDP 的基本架构 XDP 的软件要求 XDP 的硬件要求 XDP 的工作流程及使用 XDP 的工作模式 XDP 的工作流程 Hello World XDP 的应用 ...