aggregate

  • 函数原型:aggregate(zeroValue, seqOp, combOp)
  • seqOp相当于Map
  • combOp相当于Reduce
  • zeroValue是seqOp每一个partion的初始值,是一个元组,默认为0。
  • 计算列表中总数:
sc.parallelize( [[123],[4,5,6],[7,8,9]] )\
.aggregate(0, lambda: x,y: sum(y)+x, lambda x,y: x+y)
# [('world', 1), ('hello', 2), ('morning', 1)]

seqOp的输入值为x,y,其中x为初始值或中间值(如果当前partion有多个列表那就有中间值了,即上一个seqOp返回的值),而y就是第一个输入,比如:[1,2,3],[4,5,6],[7,8,9]。。。 combOp的输入值也为x,y,其中y为初始值或中间值(超过2个partion时肯定会产生中间值),x为输入值。比如1+2+3=6,4+5+6=15,7+8+9=24。那6,15,24都会作为输入值计算。当然此处的combOp在调用过程中也并非是串行的挨个把6,15,24加起来,中间也会有先汇总再求和的过程。但对用户来说此处是透明的。 我们看到aggregate中把每一个物理上的输入行作为一个计算单位输入并输出,他比较适合计算总数,行数等类似与列中所蕴含值无关的统计维度。


aggregateByKey

  • 函数原型:aggregateByKey(zeroValue, seqFunc, combFunc, numPartitions=None)
  • 参数与aggregate相同
  • 根据key进行合并

  • 上例稍加改动可以完成一个wordcounts

sc.parallelize(["hello world", "hello morning"])\
.flatMap(lambda line: line.split())\
.map(lambda letter: (letter, 1)).aggregateByKey(0, lambda x,y: y+x, lambda x,y: x+y)\
.collect()
# [(1, 1), (1, 2), (2, 1), (2, 2)]

cartesian

  • 返回两个rdd的笛卡儿积
rdd1 = sc.parallelize([1, 2])
rdd2 = sc.parallelize([3, 4, 5])
rdd1.catesian(rdd2).cellect()
# [(1, 1), (1, 2), (2, 1), (2, 2)]

glom

  • 将一个一维横向列表,划分为多个块
sc.parallelize([1,2,3,4,5], 1).collect()
# [1, 2, 3, 4, 5]
sc.parallelize([1,2,3,4,5], 1).glom().collect()
# [[1, 2, 3, 4, 5]]
sc.parallelize([1,2,3,4,5], 2).glom().collect()
# [[1, 2], [3, 4, 5]]

coalesce

  • 将多个块组合成n个大的列表
sc.parallelize([1,2,3,4,5], 3).coalesce(2).glom().collect()
# [[1], [2, 3, 4, 5]]
sc.parallelize([1,2,3,4,5], 3).coalesce(2).collect()
# [1, 2, 3, 4, 5]
sc.parallelize([1,2,3,4,5], 3).glom().collect()
# [[1], [2, 3], [4, 5]]

cogroup

  • 函数原型:cogroup(other, numPartitions=None)

  • 按key聚合后,求两个RDD的并集。

x = sc.parallelize([("a", 1), ("b", 4)])
y = sc.parallelize([("a", 2)])
map((lambda (x,y): (x, (list(y[0]), list(y[1])))), sorted(list(x.cogroup(y).collect())))
# [('a', ([1], [2])), ('b', ([4], []))]

collectAsMap

  • 将rdd数据按KV对形式返回
sc.parallelize([(1,2), (3,4)]).collectAsMap()
# {1: 2, 3: 4}
sc.parallelize([(1, (2, 6666)), (3, 4)]).collectAsMap()
# {1: (2, 6666), 3: 4}

combineByKey

  • 函数原型:combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=None)

  • 根据key进行


count

  • 返回rdd中元素的数目
sc.parallelize([2,3,4]).count()
# 3

countByKey

  • 按key聚合后计数
rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])
rdd.countByKey().items()
# [('a', 2), ('b', 1)]

countByValue

  • 按value聚合后再计数
sc.parallelize(["hello", "world", "hello", "china", "hello"]).countByValue().items()
# [('world', 1), ('china', 1), ('hello', 3)]

countApprox

  • countApprox(timeout, confidence=0.95) 貌似在公司版本中还未提供 count的一个升级版(实验中),当超过timeout时,返回一个未完成的结果。
rdd = sc.parallelize(range(1000), 10)
rdd.countApprox(1000, 1.0)
# 1000

distinct

  • distinct(numPartitions=None) 返回rdd中unique的元素
sorted(sc.parallelize([1, 1, 2, 3]).distinct().collect()
# [1, 2, 3]

filter

  • 过滤一个RDD中,其每一行必须瞒住filter的条件
rdd = sc.parallelize([1, 2, 3, 4, 5])
rdd.filter(lambda x: x%2==0).collect()
# [2, 4]

first

  • 返回rdd中的第一个元素
sc.parallelize([2, 3, 4]).first()

flatMap

  • flatMap(f, preservesPartitioning=False) 返回rdd中的所有元素,并把flatMap中返回的列表拉平。
rdd = sc.parallelize([2, 3, 4])
rdd.flatMap(lambda x: range(1, x)).collect()
# [1, 1, 1, 2, 2, 3]

flatMapValues

  • 同flatMap,但按照key进行flat,并最终拉平。
x = sc.parallelize([("a", ["x", "y", "z"]), ("b", ["p", "r"])])
def f(x): return x
x.flatMapValues(f).collect()
# [('a', 'x'), ('a', 'y'), ('a', 'z'), ('b', 'p'), ('b', 'r')]

fold

  • fold(zeroValue, op) 聚合RDD的每一个分区,最后再合并计算,每一个函数默认值为"zeroValue"。 op(t1,t2)函数可以更改t1并且将更改后的t1作为返回值返回以减少对象内存占用。切记不可个性t2的值。
def add(x,y): return x+y
sc.parallelize([1, 2, 3, 4, 5]).fold(0, add)
# 15

Spark常用RDD操作总结的更多相关文章

  1. 08、Spark常用RDD变换

    08.Spark常用RDD变换 8.1 概述 Spark RDD内部提供了很多变换操作,可以使用对数据的各种处理.同时,针对KV类型的操作,对应的方法封装在PairRDDFunctions trait ...

  2. 【spark】RDD操作

    RDD操作分为转换操作和行动操作. 对于RDD而言,每一次的转化操作都会产生不同的RDD,供一个操作使用. 我们每次转换得到的RDD是惰性求值的 也就是说,整个转换过程并不是会真正的去计算,而是只记录 ...

  3. 【Spark】RDD操作具体解释4——Action算子

    本质上在Actions算子中通过SparkContext运行提交作业的runJob操作,触发了RDD DAG的运行. 依据Action算子的输出空间将Action算子进行分类:无输出. HDFS. S ...

  4. 04、常用RDD操作整理

    常用Transformation 注:某些函数只有PairRDD只有,而普通的RDD则没有,比如gropuByKey.reduceByKey.sortByKey.join.cogroup等函数要根据K ...

  5. 【Spark】RDD操作具体解释3——键值型Transformation算子

    Transformation处理的数据为Key-Value形式的算子大致能够分为:输入分区与输出分区一对一.聚集.连接操作. 输入分区与输出分区一对一 mapValues mapValues:针对(K ...

  6. 【Spark】RDD操作具体解释2——值型Transformation算子

    处理数据类型为Value型的Transformation算子能够依据RDD变换算子的输入分区与输出分区关系分为下面几种类型: 1)输入分区与输出分区一对一型 2)输入分区与输出分区多对一型 3)输入分 ...

  7. Spark学习(一)--RDD操作

    标签(空格分隔): 学习笔记 Spark编程模型的两种抽象:RDD(Resilient Distributed Dataset)和两种共享变量(支持并行计算的广播变量和累加器). RDD RDD是一种 ...

  8. Spark 键值对RDD操作

    键值对的RDD操作与基本RDD操作一样,只是操作的元素由基本类型改为二元组. 概述 键值对RDD是Spark操作中最常用的RDD,它是很多程序的构成要素,因为他们提供了并行操作各个键或跨界点重新进行数 ...

  9. Spark编程模型及RDD操作

    转载自:http://blog.csdn.net/liuwenbo0920/article/details/45243775 1. Spark中的基本概念 在Spark中,有下面的基本概念.Appli ...

随机推荐

  1. 1046-第K回文数

    描述 回文数是这样一个正整数:它从左往右读和从右往左读是一样的.例如1,111,121,505都是回文数.将1到100,000,000内所有回文数按从小到达排序后,第k个回文数是多少呢? 输入 第一行 ...

  2. red5研究(一):下载,工程建立、oflaDemo安装、demo测试

    一.red5下载.添加工程到myeclipse 1,从官网上下载red51.01版本(我下载的是red51.0的版本),下载链接http://www.red5.org/downloads/red5/1 ...

  3. SPRING IN ACTION 第4版笔记-第九章Securing web applications-009-拦截请求()

    一. 对特定的请求拦截 For example, consider the requests served by the Spittr application. Certainly, thehome ...

  4. P59、面试题7:用两个栈实现队列

    题目:用两个栈实现一个队列.队列声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列为插入结点和在队列头部删除结点的功能. stack1专门用于插入数据,stack2 ...

  5. SharePoint2013切换帐户登录菜单

    SharePoint2013帐户姓名显示的地方没有切换帐户的菜单,这个功能对于终端用户是可有可无的,但对于sharepoint管理员或sharepoint开发人员来讲,却是一个很重要的菜单,由于经常要 ...

  6. Android开发之Service的写法以及与Activity的通信

    Service的总结: 1.按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外 ...

  7. Android开发之R文件丢失

    在进行android开发的过程中,不知道怎么回事,代码中出现R代码有红色波浪线了,于是进行了clean,结果还是有红色波浪线,然后就重启了eclipse,重启以后还是这个样子,随后发现工程的R文件丢失 ...

  8. hdu4619Warm up 2

    http://acm.hdu.edu.cn/showproblem.php?pid=4619 二分图匹配  最小点覆盖 = 最大匹配 #include <iostream> #includ ...

  9. Innodb引擎 long semaphore waits

    上一篇介绍了因为子表过多,导致innodb crash的情况,但crash的原因是long semaphore waits.long semaphore waits又为何物? 背景:Innodb使用了 ...

  10. Dapper连接Oracle

    Dapper连接Oracle去年写过了篇博客,名字叫:让dapper支持Oracle 网址:http://www.cnblogs.com/ushou/archive/2012/09/28/270690 ...