Spark学习笔记之RDD中的Transformation和Action函数
总算可以开始写第一篇技术博客了,就从学习Spark开始吧。之前阅读了很多关于Spark的文章,对Spark的工作机制及编程模型有了一定了解,下面把Spark中对RDD的常用操作函数做一下总结,以pyspark库为例。
RDD 的操作函数(operation)主要分为2种类型 Transformation 和 Action,如下图:
Transformation:
map
(f, preservesPartitioning=False):将一个函数应用到这个RDD的每个element上,返回一个新的RDD。下面例子将rdd中每个element复制两遍:
from pyspark import SparkContext sc = SparkContext('local', 'test') rdd = sc.parallelize(['a', 'b', 'c']) rdd.map(lambda x: x*2).collect() Out: ['aa', 'bb', 'cc']
filter
(f):返回仅包含满足应用到element函数的新RDD。下面例子将过滤出rdd中的偶数:
rdd = sc.parallelize([1, 2, 3, 4]) rdd.filter(lambda x: x%2 == 0).collect() Out: [2, 4]
flatMap
(f, preservesPartitioning=False):返回一个新的RDD,首先将一个函数应用到这个RDD的所有element上,注意返回的是多个结果。
rdd.flatMap(lambda x: range(1, x)).collect() Out: [1, 1, 2, 1, 2, 3]
mapPartitions
(f, preservesPartitioning=False):通过将一个函数应用到这个RDD的每个partition上,返回一个新的RDD。
rdd = sc.parallelize([1, 2, 3, 4], 2) def f(iterator): yield sum(iterator) rdd.mapPartitions(f).collect()
Out:[3, 7]
mapPartitionsWithIndex
(f, preservesPartitioning=False):通过在RDD的每个partition上应用一个函数来返回一个新的RDD,同时跟踪原始partition的索引。下面例子返回索引和:
rdd = sc.parallelize([1, 2, 3, 4], 4) def f(splitIndex, iterator): yield splitIndex rdd.mapPartitionsWithIndex(f).sum() Out:6
sample
(withReplacement, fraction, seed=None):根据给定的随机种子seed,随机抽样出数量为frac的数据,返回RDD。
rdd = sc.parallelize(range(100), 4) rdd.sample(False, 0.2, 10).count() Out: 21
union
(other):返回两个RDD的并集。
rdd = sc.parallelize([1, 1, 2, 3]) rdd.union(rdd).collect() Out: [1, 1, 2, 3, 1, 1, 2, 3]
distinct
(numPartitions=None):类似于python中的set(),返回不重复的元素集合。
sc.parallelize([1, 1, 2, 3]).distinct().collect() Out:[1, 2, 3]
groupByKey
(numPartitions=None, partitionFunc=<function portable_hash>):在一个由(K,V)对组成的数据集上调用,返回一个(K,Seq[V])对的数据集。注意:默认情况下,使用8个并行任务进行分组,你可以传入numTask可选参数,根据数据量设置不同数目的Task。
>>> rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])
>>> sorted(rdd.groupByKey().mapValues(len).collect())
[('a', 2), ('b', 1)]
>>> sorted(rdd.groupByKey().mapValues(list).collect())
[('a', [1, 1]), ('b', [1])]
reduceByKey
(func, numPartitions=None, partitionFunc=<function portable_hash>):在一个(K,V)对的数据集上使用,返回一个(K,V)对的数据集,key相同的值,都被使用指定的reduce函数聚合到一起。和groupbykey类似,任务的个数是可以通过第二个可选参数来配置的。
>>> from operator import add
>>> rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])
>>> sorted(rdd.reduceByKey(add).collect())
[('a', 2), ('b', 1)]
sortByKey
(ascending=True, numPartitions=None, keyfunc=<function RDD.<lambda>>):按照key来进行排序,是升序还是降序,ascending是boolean类型
>>> tmp = [('a', 1), ('b', 2), ('', 3), ('d', 4), ('', 5)]
>>> sc.parallelize(tmp).sortByKey().first()
('', 3)
>>> sc.parallelize(tmp).sortByKey(True, 1).collect()
[('', 3), ('', 5), ('a', 1), ('b', 2), ('d', 4)]
>>> sc.parallelize(tmp).sortByKey(True, 2).collect()
[('', 3), ('', 5), ('a', 1), ('b', 2), ('d', 4)]
>>> tmp2 = [('Mary', 1), ('had', 2), ('a', 3), ('little', 4), ('lamb', 5)]
>>> tmp2.extend([('whose', 6), ('fleece', 7), ('was', 8), ('white', 9)])
>>> sc.parallelize(tmp2).sortByKey(True, 3, keyfunc=lambda k: k.lower()).collect()
[('a', 3), ('fleece', 7), ('had', 2), ('lamb', 5),...('white', 9), ('whose', 6)]
join
(other, numPartitions=None):在类型为(K,V)和(K,W)类型的数据集上调用,返回一个(K,(V,W))对,每个key中的所有元素都在一起的数据集。默认为inner join
>>> x = sc.parallelize([("a", 1), ("b", 4)])
>>> y = sc.parallelize([("a", 2), ("a", 3)])
>>> sorted(x.join(y).collect())
[('a', (1, 2)), ('a', (1, 3))]
cogroup
(other, numPartitions=None):当有两个KV的dataset(K,V)和(K,W),返回的是(K,Seq[V],Seq[W])的dataset,即outer join
>>> x = sc.parallelize([("a", 1), ("b", 4)])
>>> y = sc.parallelize([("a", 2)])
>>> [(x, tuple(map(list, y))) for x, y in sorted(list(x.cogroup(y).collect()))]
[('a', ([1], [2])), ('b', ([4], []))]
cartesian
(other):笛卡尔积。但在数据集T和U上调用时,返回一个(T,U)对的数据集,所有元素交互进行笛卡尔积。
>>> rdd = sc.parallelize([1, 2])
>>> sorted(rdd.cartesian(rdd).collect())
[(1, 1), (1, 2), (2, 1), (2, 2)]
Action:
reduce
(f):说白了就是聚集,但是传入的函数是两个参数输入返回一个值,这个函数必须是满足交换律和结合律的
>>> from operator import add
>>> sc.parallelize([1, 2, 3, 4, 5]).reduce(add)
15
>>> sc.parallelize((2 for _ in range(10))).map(lambda x: 1).cache().reduce(add)
10
>>> sc.parallelize([]).reduce(add)
Traceback (most recent call last):
...
ValueError: Can not reduce() empty RDD
collect
():一般在filter或者足够小的结果的时候,再用collect封装返回一个数组
count():返回的是dataset中的element的个数
first():返回的是dataset中的第一个元素
take(n):返回一个数组,由数据集的前n个元素组成。注意,这个操作目前并非在多个节点上,并行执行,而是Driver程序所在机器,单机计算所有的元素(Gateway的内存压力会增大,需要谨慎使用)
>>> sc.parallelize([2, 3, 4, 5, 6]).cache().take(2)
[2, 3]
>>> sc.parallelize([2, 3, 4, 5, 6]).take(10)
[2, 3, 4, 5, 6]
>>> sc.parallelize(range(100), 100).filter(lambda x: x > 90).take(3)
[91, 92, 93]
takeSample
(withReplacement, num, seed=None):抽样返回一个dataset中的num个元素,随机种子seed
>>> rdd = sc.parallelize(range(0, 10))
>>> len(rdd.takeSample(True, 20, 1))
20
>>> len(rdd.takeSample(False, 5, 2))
5
>>> len(rdd.takeSample(False, 15, 3))
10
saveAsTextFile
(path, compressionCodecClass=None):将数据集的元素,以textfile的形式,保存到本地文件系统,hdfs或者任何其它hadoop支持的文件系统。Spark将会调用每个元素的toString方法,并将它转换为文件中的一行文本
saveAsSequenceFile
(path, compressionCodecClass=None):将数据集的元素,以sequencefile的格式,保存到指定的目录下,本地系统,hdfs或者任何其它hadoop支持的文件系统。RDD的元素必须由key-value对组成,并都实现了Hadoop的Writable接口,或隐式可以转换为Writable(Spark包括了基本类型的转换,例如Int,Double,String等等)
countByKey
():返回的是key对应的个数的一个map,作用于一个RDD
>>> rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])
>>> sorted(rdd.countByKey().items())
[('a', 2), ('b', 1)]
foreach
(f):在数据集的每一个元素上,运行函数func。这通常用于更新一个累加器变量,或者和外部存储系统做交互
>>> def f(x): print(x)
>>> sc.parallelize([1, 2, 3, 4, 5]).foreach(f)
Spark学习笔记之RDD中的Transformation和Action函数的更多相关文章
- Spark学习笔记2——RDD(上)
目录 Spark学习笔记2--RDD(上) RDD是什么? 例子 创建 RDD 并行化方式 读取外部数据集方式 RDD 操作 转化操作 行动操作 惰性求值 Spark学习笔记2--RDD(上) 笔记摘 ...
- Spark学习笔记3——RDD(下)
目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...
- 学习笔记27—python中numpy.ravel() 和 flatten()函数
简介 首先声明两者所要实现的功能是一致的(将多维数组降位一维).这点从两个单词的意也可以看出来,ravel(散开,解开),flatten(变平).两者的区别在于返回拷贝(copy)还是返回视图(vie ...
- Spark学习笔记2:RDD编程
通过一个简单的单词计数的例子来开始介绍RDD编程. import org.apache.spark.{SparkConf, SparkContext} object word { def main(a ...
- Spark学习笔记之SparkRDD
Spark学习笔记之SparkRDD 一. 基本概念 RDD(resilient distributed datasets)弹性分布式数据集. 来自于两方面 ① 内存集合和外部存储系统 ② ...
- spark学习笔记总结-spark入门资料精化
Spark学习笔记 Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用. ...
- Spark学习笔记总结-超级经典总结
Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用.减少了延时处理,提高 ...
- Spark学习笔记0——简单了解和技术架构
目录 Spark学习笔记0--简单了解和技术架构 什么是Spark 技术架构和软件栈 Spark Core Spark SQL Spark Streaming MLlib GraphX 集群管理器 受 ...
- Spark学习笔记1——第一个Spark程序:单词数统计
Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ...
随机推荐
- OSI模型和TCP/IP协议族(一)
1990年以前,再数据通信和组网文献中占主导地位的分层模型是开放系统互连(Open System Interconnnection,OSI)模型.当时所有人都认为OSI模型将是数据通信的最终标准,然而 ...
- 深入理解Java虚拟机类加载机制
1.类加载时机 对于类加载的第一个阶段---加载,虚拟机没有强制的约束,但是对于初始化阶段,虚拟机强制规定有且只有以下的5中情况必须开始初始化,当然,加载.验证.准备阶段在初始化前就已经开始. ①使用 ...
- IIS支持PHP文件解析
打开IIS程序映射 添加模块映射 请求路径为:*.php 模块为:FastCgiModule 可执行路径选择 php-cgi.exe 名称随意写
- python smtp模块发送邮件
应用场景: 在服务器上设置的告警参数被触发后,通常是发送手机短信或者邮件通知,本例就以发送邮件为例,手机怎么收邮件呢?以qq邮箱为例,在手机端安装qq邮箱app,触发邮件后,手机也能及时查看了 代码展 ...
- WordPress后台添加友情链接管理功能
其实很早之前WordPress是有这个功能的,但是伴随着wordpress的经常升级和主题的升级以及更换,有时候后台会发现没有链接管理的入口,不过还是可以通过代码还原这个功能. 将以下代码添加到您当前 ...
- python 全栈开发,Day4(正式)
一.列表 列表是python中的基础数据类型之一,它是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = ['alex',123,Ture,(1,2,3,'wusir') ...
- OpenCV与Qt的环境搭建及Demo
前言: 前段时间写了很多OpenCV的程序,虽然重点在算法上,但图像窗口只能靠cvNamedWindow,效果很不理想.遂希望用Qt配合OpenCV使用,为我的程序建立图形化界面.然而,依我对Open ...
- 使用CoreRT将.NET Core发布为Native应用程序
在上一篇文章<使用.NET Core快速开发一个较正规的命令行应用程序>中我们看到了使用自包含方式发布的.NET Core应用中包含了216个文件.我就写一个cat命令用得着这么动真格.. ...
- 8.String StringBuffer StringBuilder
http://www.cnblogs.com/xiohao/p/4271140.html
- xampp配置多端口访问
1.修改D:\xampp\apache\conf\extra中的httpd-vhosts.conf文件,在最底部添加 <VirtualHost *:8080> ##需要监听的端口号 Ser ...