【Spark机器学习速成宝典】基础篇02RDD常见的操作(Python版)
目录
引例入门:textFile、collect、filter、first、persist、count
创建RDD的方式:parallelize、textFile
转化操作:map、filter、flatMap、sample、union、intersection、subtract、cartesian、distinct、groupByKey、reduceByKey、sortByKey、join、cogroup
行动操作:reduce、collect、count、first、take、takeSample、takeOrdered、saveAsTextFile、saveAsSequenceFile、countByKey、foreach
简单的wordCount程序
引例入门textFile、collect、filter、first、persist、count |
- # -*-coding=utf-8 -*-
- from pyspark import SparkConf, SparkContext
- sc = SparkContext('local')
- lines = sc.textFile("README.md") #使用textFile()创建一个字符串RDD。lines是一个字符串RDD(弹性分布式数据集)。文件中的每一行是其中的一个元素
- print type(lines) #<class 'pyspark.rdd.RDD'>
- print lines.collect()[0] #collect()从RDD转换到List 打印第一个元素:# Apache Spark
- pythonLines = lines.filter(lambda line: "Python" in line) #filter是对RDD元素进行过滤;返回一个新的数据集,由经过func函数后返回值为true的元素组成
- for i in pythonLines.collect():
- print i
- '''
- high-level APIs in Scala, Java, Python, and R, and an optimized engine that
- ## Interactive Python Shell
- Alternatively, if you prefer Python, you can use the Python shell:
- '''
- print type(pythonLines.collect()) #<type 'list'>
- print pythonLines.first() #获取第一行:high-level APIs in Scala, Java, Python, and R, and an optimized engine that
- pythonLines.persist() #如果pythonLines被下游程序反复使用,将pythonLines持久化到内存可以提高计算效率
- print pythonLines.count() #求RDD中元素个数。输出:3
创建RDD的方式:parallelize、textFile |
- # -*-coding=utf-8 -*-
- from pyspark import SparkConf, SparkContext
- sc = SparkContext('local')
- print sc.parallelize([1, 2, 3, 4]).collect() #[1, 2, 3, 4]
- print sc.textFile("README.md").collect() #[u'# Apache Spark', u'', u'Spark is a fast and general cluster computing system for Big Data. It provides'
转化操作:map、filter、flatMap、sample、union、intersection、subtract、 cartesian、distinct、groupByKey、reduceByKey、sortByKey、join、cogroup、mapValues |
- # -*-coding=utf-8 -*-
- from pyspark import SparkConf, SparkContext
- sc = SparkContext('local')
- #map(func):对RDD中的每个元素都执行一个指定的函数产生一个新的RDD。RDD之间的元素是一对一关系
- print sc.parallelize([1, 2, 3, 4]).map(lambda x: x * x).collect() #[1, 4, 9, 16]
- print sc.parallelize(["hello world", "hi"]).map(lambda line: line.split(" ")).collect() #[['hello', 'world'], ['hi']]
- #filter(func):是对RDD元素进行过滤;返回一个新的数据集,由经过func函数后返回值为true的元素组成
- print sc.parallelize([1, 2, 3, 4]).filter(lambda x: x>2).collect() #[3, 4]
- #flatMap(func):类似于map,但是输出结果会被“拍扁”
- print sc.parallelize(["hello world", "hi"]).flatMap(lambda line: line.split(" ")).collect() #['hello', 'world', 'hi']
- #sample(withReplacement,fraction,seed)根据给定的随机种子seed,随机抽样出fraction比例的数据,withReplacement:是否放回抽样
- print sc.parallelize([1, 2, 3, 4, 5, 6, 7]).sample(True,0.2,1).collect() #[1, 7, 7]
- #union(RDD):RDD取并集
- print sc.parallelize([1, 2, 3]).union(sc.parallelize([3, 4, 5])).collect() #[1, 2, 3, 3, 4, 5]
- #intersection(RDD):RDD取交集
- print sc.parallelize([1, 2, 3]).intersection(sc.parallelize([3, 4, 5])).collect() #[3]
- #subtract(RDD):差集
- print sc.parallelize([1, 2, 3]).subtract(sc.parallelize([3, 4, 5])).collect() #[2, 1]
- #cartesian(RDD):笛卡尔乘积,作用于数据集T和U上,返回(T, U),即数据集中每个元素的两两组合
- print sc.parallelize([1, 2, 3]).cartesian(sc.parallelize([3, 4, 5])).collect() #[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 3), (3, 4), (3, 5)]
- #distinct():RDD去重
- print sc.parallelize([1, 2, 3, 3]).distinct().collect() #[1, 2, 3]
- #groupByKey():作用于由键值对(K, V)组成的数据集上,将Key相同的数据放在一起,返回一个由键值对(K, Iterable)组成的数据集
- a = sc.parallelize({(1,2),(3,4),(3,6)}).groupByKey().collect() #[(1, Iterable), (3, Iterable)]
- for i in a:
- print str(i[0])+":"+str(list(i[1])) #1:[2] ; 3:[4, 6]
- #reduceByKey():作用于键值对(K, V)上,按Key分组,然后将Key相同的键值对的Value都执行func操作,得到一个值
- print sc.parallelize({(1,2),(3,4),(3,6)}).reduceByKey(lambda x,y: x+y).collect() #[(1, 2), (3, 10)]
- #sortByKey([ascending=True], [numTasks]):按照Key进行排序,ascending的值默认为True,True/False表示升序还是降序
- print sc.parallelize({(2,2),(1,4),(3,6)}).sortByKey().collect() #[(1, 4), (2, 2), (3, 6)]
- #join(otherDataset, [numTasks]):类似于SQL中的连接操作,即作用于键值对(K, V)和(K, W)上,返回元组 (K, (V, W)),spark也支持外连接,包括leftOuterJoin,rightOuterJoin和fullOuterJoin。例子:
- print sc.parallelize({(1,2),(3,4),(3,6)}).join(sc.parallelize({(3,7),(4,8)})).collect() #[(3, (4, 7)), (3, (6, 7))]
- print sc.parallelize({(1,2),(3,4),(3,6)}).leftOuterJoin(sc.parallelize({(3,7),(4,8)})).collect() #[(1, (2, None)), (3, (4, 7)), (3, (6, 7))]
- print sc.parallelize({(1,2),(3,4),(3,6)}).rightOuterJoin(sc.parallelize({(3,7),(4,8)})).collect() #[(4, (None, 8)), (3, (4, 7)), (3, (6, 7))]
- print sc.parallelize({(1,2),(3,4),(3,6)}).fullOuterJoin(sc.parallelize({(3,7),(4,8)})).collect() #[(4, (None, 8)), (1, (2, None)), (3, (4, 7)), (3, (6, 7))]
- #cogroup(otherDataset, [numTasks]):作用于键值对(K, V)和(K, W)上,返回元组 (K, (Iterable, Iterable))。这一操作可叫做groupWith。
- a = sc.parallelize({(1,2),(3,4),(3,6)}).cogroup(sc.parallelize({(3,7),(4,8)})).collect() #[(4, (Iterable, Iterable)), (1, (Iterable, Iterable)), (3, (Iterable, Iterable))]
- for i in a:
- print str(i[0])+":"+str(list(i[1][0]))+","+str(list(i[1][1])) #4:[],[8] ; 1:[2],[] ;3:[4, 6],[7]
- #mapValues(func): 扩展值
- print sc.parallelize({("panda",0),("pink",3)}).mapValues(lambda x:(x,1)).collect() #[('pink', (3, 1)), ('panda', (0, 1))]
行动操作:reduce、collect、count、first、take、takeSample、takeOrdered、 saveAsTextFile、saveAsSequenceFile、countByKey、foreach、countByValue |
- # -*-coding=utf-8 -*-
- from pyspark import SparkConf, SparkContext
- sc = SparkContext('local')
- #reduce(func):对数据集的所有元素执行func函数
- print sc.parallelize([1, 2, 3, 3]).reduce(lambda x,y:x+y) #
- #collect():对数据集转化为List
- print sc.parallelize([1, 2, 3, 3]).collect() #[1, 2, 3, 3]
- #count(): 返回数据集元素个数
- print sc.parallelize([1, 2, 3, 3]).count() #
- #first(): 返回数据集中第一个元素
- print sc.parallelize([1, 2, 3, 3]).first() #
- #take(n): 返回数据集中前n个元素元素
- print sc.parallelize([1, 2, 3, 3]).take(2) #
- #takeSample(withReplacementnum,[seed])返回包含随机的num个元素的数组,和sample不同,takeSample 是行动操作,所以返回的是数组而不是RDD,其中第一个参数withReplacement是抽样时是否放回,第二个参数num会精确指定抽样数,而不是比例。
- print sc.parallelize([1, 2, 3, 3]).takeSample(True,2) #[1, 3]
- #takeOrdered(n,[ordering]): 按自然顺序或者指定的排序规则返回前n个元素
- print sc.parallelize([10, 1, 2, 9, 3, 4, 5, 6, 7]).takeOrdered(6) #[1, 2, 3, 4, 5, 6]
- print sc.parallelize([10, 1, 2, 9, 3, 4, 5, 6, 7]).takeOrdered(6, key=lambda x: -x) #[10, 9, 7, 6, 5, 4]
- print sc.parallelize([(10, 1), (2, 9), (3, 4), (5, 6)]).takeOrdered(6, key=lambda x: -x[1]) #[(2, 9), (5, 6), (3, 4), (10, 1)]按第二个的降序排序
- #saveAsTextFile(path): 保存为TextFile文件
- sc.parallelize([1, 2, 3, 3]).saveAsTextFile("a") #[(2, 9), (5, 6), (3, 4), (10, 1)]按第二个的降序排序
- #saveAsSequenceFile(path): 保存为SequenceFile文件
- sc.parallelize({("",""),("",""),("","")}).saveAsSequenceFile("b") #[(2, 9), (5, 6), (3, 4), (10, 1)]按第二个的降序排序
- #countByKey(): 对于(K,V)类型的RDD。返回一个(K,Int)的字典,Int为K的个数
- print sc.parallelize([("a", 1), ("b", 1), ("a", 1)]).countByKey() #defaultdict(<type 'int'>, {'a': 2, 'b': 1})
- #foreach(func): 对数据集中的每个元素执行func函数
- def f(x): print(x*2)
- sc.parallelize([1, 2, 3, 3]).foreach(f) #2,4,6,6
- #countByValue(): 根据值计数
- print sc.parallelize([1, 2, 1, 2, 2]).countByValue().items() #[(1, 2), (2, 3)]
简单的wordCount程序 |
- # -*-coding=utf-8 -*-
- from pyspark import SparkConf, SparkContext
- sc = SparkContext('local')
- #方法一:
- print sc.parallelize(["hello","hi","hello"]).flatMap(lambda x: x.split(" ")).collect() #['hello', 'hi', 'hello']
- print sc.parallelize(["hello","hi","hello"]).flatMap(lambda x: x.split(" ")).map(lambda x:(x,1)).reduceByKey(lambda x,y:x+y).collect() #[('hi', 1), ('hello', 2)]
- #方法二:
- print sc.parallelize(["hello","hi","hello"]).flatMap(lambda x: x.split(" ")).collect() #['hello', 'hi', 'hello']
- print sc.parallelize(["hello","hi","hello"]).flatMap(lambda x: x.split(" ")).countByValue() #defaultdict(<type 'int'>, {'hi': 1, 'hello': 2})
【Spark机器学习速成宝典】基础篇02RDD常见的操作(Python版)的更多相关文章
- 【Spark机器学习速成宝典】基础篇01Windows下spark开发环境搭建+sbt+idea(Scala版)
注意: spark用2.1.1 scala用2.11.11 材料准备 spark安装包 JDK 8 IDEA开发工具 scala 2.11.8 (注:spark2.1.0环境于scala2.11环境开 ...
- 【Spark机器学习速成宝典】基础篇04数据类型(Python版)
目录 Vector LabeledPoint Matrix 使用C4.5算法生成决策树 使用CART算法生成决策树 预剪枝和后剪枝 应用:遇到连续与缺失值怎么办? 多变量决策树 Python代码(sk ...
- 【Spark机器学习速成宝典】基础篇03数据读取与保存(Python版)
目录 保存为文本文件:saveAsTextFile 保存为json:saveAsTextFile 保存为SequenceFile:saveAsSequenceFile 读取hive 保存为文本文件:s ...
- 【Spark机器学习速成宝典】模型篇08保序回归【Isotonic Regression】(Python版)
目录 保序回归原理 保序回归代码(Spark Python) 保序回归原理 待续... 返回目录 保序回归代码(Spark Python) 代码里数据:https://pan.baidu.com/s/ ...
- 【Spark机器学习速成宝典】模型篇07梯度提升树【Gradient-Boosted Trees】(Python版)
目录 梯度提升树原理 梯度提升树代码(Spark Python) 梯度提升树原理 待续... 返回目录 梯度提升树代码(Spark Python) 代码里数据:https://pan.baidu.co ...
- 【Spark机器学习速成宝典】模型篇06随机森林【Random Forests】(Python版)
目录 随机森林原理 随机森林代码(Spark Python) 随机森林原理 参考:http://www.cnblogs.com/itmorn/p/8269334.html 返回目录 随机森林代码(Sp ...
- 【Spark机器学习速成宝典】模型篇05决策树【Decision Tree】(Python版)
目录 决策树原理 决策树代码(Spark Python) 决策树原理 详见博文:http://www.cnblogs.com/itmorn/p/7918797.html 返回目录 决策树代码(Spar ...
- 【Spark机器学习速成宝典】模型篇04朴素贝叶斯【Naive Bayes】(Python版)
目录 朴素贝叶斯原理 朴素贝叶斯代码(Spark Python) 朴素贝叶斯原理 详见博文:http://www.cnblogs.com/itmorn/p/7905975.html 返回目录 朴素贝叶 ...
- 【Spark机器学习速成宝典】模型篇03线性回归【LR】(Python版)
目录 线性回归原理 线性回归代码(Spark Python) 线性回归原理 详见博文:http://www.cnblogs.com/itmorn/p/7873083.html 返回目录 线性回归代码( ...
随机推荐
- BZOJ 4141 [Thu Summer Camp 2013]魔塔
权限题qwq 以下设值域大小为\(m\) 先考虑枚举攻击力,因为首先攻击力决定每个怪物的攻击次数,然后对于每个怪物,攻击次数为\(\lceil\frac{hp_i}{ATK-def_i}\rceil\ ...
- 企业面试题|最常问的MySQL面试题集合(三)
分区表的原理 分库分表的原理 延伸: MySQL的复制原理及负载均衡 分区表的工作原理 对用户而言,分区表是一个独立的逻辑表,但是底层MySQL将其分成了多个物理子表,这对用户来说是透明的,每一个分区 ...
- centos部署LVS负载均衡直接路由DR模式
环境: 在vm里开三个虚拟机 负载调度器:10.0.3.102 真实服务器1:10.0.3.103 真实服务器2:10.0.3.104 虚拟ip: 10.0.3.99 (用来飘移) 负载调度器上 if ...
- SQL注入的一些技巧分享
先上一道简单的ctf注入题: 一道利用order by进行注入的ctf题 很不错的一道利用order by的注入题,之前不知道order by除了爆字段还有这种操作. 原题地址:http://chal ...
- Git忽略文件的三个办法
方法一(并不好用) 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规 ...
- mysql排错小指南
mysql排错小指南 查询运行很慢时,可以执行mysql> show processlist\G mysql> show processlist\G ******************* ...
- 使用IL DASM来查看接口内的自动属性
在我的本地地址中 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools\x64下有一个文件 ildas ...
- cmd命令删除文件夹或文件
删除空文件夹rd /s/q "D:\Program Files\afish" 删除里面的文件del /a/f/q "D:\Program Files\afish\123. ...
- 生成树计数及应用 Matrix-Tree
例:给定一个图,图上每条边是红色或蓝色 求恰好有K条红边的生成树的个数,N<=50. Matrix-Tree定理 对于限制条件可以利用多项式,把红边边权设为X,蓝边边权设为1. 最后求行列式得到 ...
- Java并发编程实战 第2章 线程安全性
编写线程安全的 代码,核心在与对共享的和可变的对象的状态的访问. 如果多个线程访问一个可变的对象时没有使用同步,那么就会出现错误.在这种情况下,有3中方式可以修复这个问题: 不在线程之间共享该状态变量 ...