1. mapWith
mapWith(i => i*10)((a,b) => b+2)
(拿到分区号)(a是每次取到的RDD中的元素,b接收i*10的结果)
2. flatMapWith
类似mapWith,区别在于flatMapWith返回的是一个序列

3. mapPartitions
每次取到的是分区号
val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7),3)
对分区每个元素乘10
rdd1.mapPartitions(_.map(_ * 10))

4. mapPartitionsWithIndex
对RDD中的每个分区进行操作,带有分区号
val rdd1 = sc.parallelize(List(1,2,3,4,5,6,7,8,9),2)
创建一个函数
(index分区号,iter分区中的每个元素)
def func1(index:Int,iter:Iterator[Int]):Iterator[String] ={
ter.toList.map(x=>"[PartID:" + index +",value="+x+"]").iterator
}
rdd1.mapPartitionsWithIndex(func1).collect
结果:
Array(
[PartID:0,value=1], [PartID:0,value=2], [PartID:0,value=3], [PartID:0,value=4],
[PartID:1,value=5], [PartID:1,value=6], [PartID:1,value=7], [PartID:1,value=8], [PartID:1,value=9])

5. aggregate:聚合操作
先对局部进行操作,再对全局进行操作
val rdd1 = sc.parallelize(List(1,2,3,4,5),2)
(初始值)(局部操作,全局操作)
rdd1.aggregate(0)(math.max(_,_),_+_)

6. aggregateByKey
类似aggregate,也是先对局部,再对全局
区别:aggregateByKey操作<key,value>
val pairRDD = sc.parallelize(List( ("cat",2), ("cat", 5), ("mouse", 4),("cat", 12), ("dog", 12), ("mouse", 2)), 2)
把每个笼子中,每种动物最多的个数进行求和
(初始值)(局部操作,全局操作)
pairRDD.aggregateByKey(0)(math.max(_,_),_+_).collect

7. foldByKey:对相同key进行聚合操作
foldByKey(初始值)(对value的操作)
拼接相同key的value字符串
val rdd1 = sc.parallelize(List("dog", "wolf", "cat", "bear"), 2)
val rdd2 = rdd1.map(x => (x.length, x))
val rdd3 = rdd2.foldByKey("")(_+_)
结果:Array[(Int, String)] = Array((4,wolfbear), (3,dogcat))

8. combineByKey 操作的是key-value
val rdd3 = rdd1.combineByKey(x => x + 10, (a: Int, b: Int) => a + b, (m: Int, n: Int) => m + n)

第一个参数:List(_),(分区的每一个元素:它的类型就是整个函数的返回类型(List[String]))
第二参数 (x: List[String], y: String=> x :+ y,):分区内的局部聚合,x与第一个参数的返回类型一致,y是RDD的每一个value
第三个参数((m: List[String], n: List[String]) => m ++ n): 全局聚合,类型与第一个参数一致
val rdd7 = rdd6.combineByKey(List(_), (x: List[String], y: String) => x :+ y, (m: List[String], n: List[String]) => m ++ n)

9. coalesce、repartition、partitionBy:重新分区
coalesce:默认不会shuffle,可以重新分更小的分区,不能分更大的分区,如果要shuffle,需要传入参数true
val rdd1 = sc.parallelize(1 to 10, 5)
val rdd2 = rdd1.coalesce(10, true)
rdd2.partitions.length
repartition: 会进行shuffle,任意分区都可以,传入参数是Int数字
rdd1.repartition(8)
partitionBy:会进行shuffle,任意分区都可以,传入参数是分区器
rdd1.partitionBy(new org.apache.spark.HashPartitioner(7))

10. countByKey 计算相同key的元组有多少个
countByValue:计算相同value的元组有多少个
val rdd1 = sc.parallelize(List(("a", 1), ("b", 2), ("b", 2), ("c", 2), ("c", 1)))
rdd1.countByKey
rdd1.countByValue

11. filterByRange :根据key的范围进行过滤
val rdd1 = sc.parallelize(List(("e", 5), ("f",2),("c", 3), ("d", 4), ("c", 2), ("a", 1)))
取出c到d范围的元组
val rdd2 = rdd1.filterByRange("c", "d")
rdd2.colllect

12. flatMapValues :对元组的值进行操作并压平
val rdd3 = sc.parallelize(List(("a","1 2"), ("b","3 4")))
rdd3.flatMapValues(_.split(" ")).collect
结果: Array[(String, String)] = Array((a,1), (a,2), (b,3), (b,4))

13. foreachPartition :对每个分区的操作,返回每个分区的结果
val rdd1 = sc.parallelize(List(1, 2, 3, 4, 5, 6, 7, 8, 9), 3)
rdd1.foreachPartition(x => println(x.reduce(_ + _)))
结果
6
15
24

14. keyBy : 将传入的参数作为元组的key,原RDD元素作为value
val rdd1 = sc.parallelize(List("dog", "salmon", "salmon", "rat", "elephant"), 3)
val rdd2 = rdd1.keyBy(_.length)
rdd2.collect
结果:Array[(Int, String)] = Array((3,dog), (6,salmon), (6,salmon), (3,rat), (8,elephant))

15. keys :获取RDD的key
values :获取RDD的value
val rdd1 = sc.parallelize(List("dog", "tiger", "lion", "cat", "panther", "eagle"), 2)
val rdd2 = rdd1.map(x => (x.length, x))
rdd2.keys.collect
rdd2.values.collect

16. collectAsMap :将集合转化成元组
val rdd = sc.parallelize(List(("a", 1), ("b", 2)))
rdd.collectAsMap
结果 :scala.collection.Map[String,Int] = Map(b -> 2, a -> 1)

【Spark】算子的更多相关文章

  1. (转)Spark 算子系列文章

    http://lxw1234.com/archives/2015/07/363.htm Spark算子:RDD基本转换操作(1)–map.flagMap.distinct Spark算子:RDD创建操 ...

  2. Spark算子总结及案例

    spark算子大致上可分三大类算子: 1.Value数据类型的Transformation算子,这种变换不触发提交作业,针对处理的数据项是Value型的数据. 2.Key-Value数据类型的Tran ...

  3. UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现

      UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现   测试数据 java代码 package com.hzf.spark.study; import ...

  4. UserView--第一种方式set去重,基于Spark算子的java代码实现

    UserView--第一种方式set去重,基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import java.util.Ha ...

  5. spark算子之DataFrame和DataSet

    前言 传统的RDD相对于mapreduce和storm提供了丰富强大的算子.在spark慢慢步入DataFrame到DataSet的今天,在算子的类型基本不变的情况下,这两个数据集提供了更为强大的的功 ...

  6. Spark算子总结(带案例)

    Spark算子总结(带案例) spark算子大致上可分三大类算子: 1.Value数据类型的Transformation算子,这种变换不触发提交作业,针对处理的数据项是Value型的数据. 2.Key ...

  7. Spark算子---实战应用

    Spark算子实战应用 数据集 :http://grouplens.org/datasets/movielens/ MovieLens 1M Datase 相关数据文件 : users.dat --- ...

  8. spark算子集锦

    Spark 是大数据领域的一大利器,花时间总结了一下 Spark 常用算子,正所谓温故而知新. Spark 算子按照功能分,可以分成两大类:transform 和 action.Transform 不 ...

  9. Spark算子使用

    一.spark的算子分类 转换算子和行动算子 转换算子:在使用的时候,spark是不会真正执行,直到需要行动算子之后才会执行.在spark中每一个算子在计算之后就会产生一个新的RDD. 二.在编写sp ...

  10. Spark:常用transformation及action,spark算子详解

    常用transformation及action介绍,spark算子详解 一.常用transformation介绍 1.1 transformation操作实例 二.常用action介绍 2.1 act ...

随机推荐

  1. idea 安装findBugs 和 checkStyle

    1.fiindBugs是一款 静态分析工具,检查程序潜在bug,在bug报告中快速定位到问题的代码上.在idea下面安装很简单可以参考 http://zhongmin2012.iteye.com/bl ...

  2. 微信小程序——组件(一)

    接着之前讲解的基础内容,应该对小程序有了一点了解.想深入了解的话,需要自己实际操作一遍比较好.首先了解官方给的组件,API等这样等顺序来比较好一些.下面贴两张demo图,demo的项目结构是设置的两个 ...

  3. Razor模板引擎 (RazorEngine)

    Razor模板引擎不仅在ASP.NET MVC中内置了Razor模板引擎,还有一个开源的RazorEngine, 这样以来我们可以在非ASP.NET MVC项目中使用Razor引擎,甚至在控制台,Wi ...

  4. windows下安装jekyll

    jekyll在其官方网站上说并不建议在windows操作系统安装,可是我们已经在windows环境下操作比较习惯了,而安装linux或mac的成本又比较高.因此,虽然在windows安装jekyll的 ...

  5. 绘制播放音乐时的音波图形的View

    绘制播放音乐时的音波图形的View 这个效果类似于这个哦: 效果如下: 源码: MusicView.h 与 MusicView.m // // MusicView.h // Music // // C ...

  6. 如何深入理解一套MQ消息中间件

    怎样算是理解了一套MQ中间件呢?原来一知半解的我列了几个维度:demo跑起来,理解其投递次数的语义,理解其事务的特性等等.这是一种角度,但总有种看山不是山的一知半解的感觉.再问一层,比如为什么Kafk ...

  7. easyui学习笔记8—在手风琴中加载其他的页面

    在手风琴中加载其他页面和在表格中加载其他的页面有写类似的,就是请求另外一个页面显示数据. 1.先看看引用的资源文件 <link rel="stylesheet" href=& ...

  8. 【转载】CodeIgniter与PHP5.6的兼容问题

    错误提示: A PHP Error was encountered Severity: Notice Message: Only variable references should be retur ...

  9. 显示锁(ReentranLock)

    1. Lock接口:定义了一组抽象的加锁操作,提供了一种无条件的.可轮询的.定时的以及可中断的锁获取操作,所有的加锁和解锁的方法都是显示的. 2. ReentrantLock锁:实现了Lock接口,并 ...

  10. 【转】python通过文件头判断文件类型

    刚刚看到一个好玩的程序,拉过来.原文地址:https://www.ttlsa.com/python/determine-file-type-by-the-file-header/ 侵权删. ===== ...