2.RDD的基本操作
有些时候,我不太喜欢介绍相关概念什么的(其实是你懒吧),而是喜欢直接介绍用法。
所以RDD是什么这里也不再介绍了,可以自行百度,下面直接介绍rdd的一些操作
from pyspark import SparkContext, SparkConf conf = SparkConf() sc = SparkContext(conf=conf) ''' 先来介绍一下rdd的一些transformation操作 ''' # 1.map ''' 类似于python里面的map,里面传一个函数,会将函数作用于rdd的每一个元素 ''' def my_map(): '''rdd有两种模式,一个是transformation,一个是action。 前者只是记录了相应的操作,并不会真正的执行,类似于python里面的生成器, 只有当遇到的action,才会真正的计算,产生值,类似于对生成器进行for循环或者__next__''' data = [1, 2, 3, 4, 5] rdd = sc.parallelize(data) rdd1 = rdd.map(lambda x: x*2) rdd2 = rdd.map(lambda x: ("古明地盆", 1)) # rdd在进行map是一个transformation,需要collect才会产生值 print(rdd1.collect()) print(rdd2.collect()) my_map() ''' 输出结果: [2, 4, 6, 8, 10] [('古明地盆', 1), ('古明地盆', 1), ('古明地盆', 1), ('古明地盆', 1), ('古明地盆', 1)] ''' # 2.filter ''' 和python的filter一样,里面传一个函数,函数返回一个bool类型,True的话保留,False剔除 ''' def my_filter(): data = [1, 2, 3, 4, 5] rdd = sc.parallelize(data) rdd1 = rdd.filter(lambda x: x>3) print(rdd1.collect()) # 也可以进行链式编程 print(sc.parallelize([1, 2, 3, 4, 5]).map(lambda x: x*2).filter(lambda x: x>5).collect()) my_filter() ''' 输出结果 [4, 5] [6, 8, 10] ''' # 3.flatMap ''' 不好解释举个栗子 ''' def my_flatMap(): data = ["hello world", "hello cruel hello", "hello beautiful world"] rdd = sc.parallelize(data) print(rdd.map(lambda line: line.split(" ")).collect()) # 使用flatMap需要每一个元素都是可迭代的 print(rdd.flatMap(lambda line: line.split(" ")).collect()) my_flatMap() ''' 输出结果 [['hello', 'world'], ['hello', 'cruel', 'hello'], ['hello', 'beautiful', 'world']] ['hello', 'world', 'hello', 'cruel', 'hello', 'hello', 'beautiful', 'world'] 可以看到flatMap相当于在map的基础上进行一个扁平化 ''' # 4.groupByKey ''' 把相同的key分发在一起 ''' def my_groupByKey(): data = ["hello world", "hello cruel hello", "hello beautiful world"] rdd = sc.parallelize(data).flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)) print(rdd.collect()) groupByKeyRdd = rdd.groupByKey() # 只是这样打印看不出来结果 print(groupByKeyRdd.collect()) # 使用这种方法 print(groupByKeyRdd.map(lambda x: (x[0], list(x[1]))).collect()) my_groupByKey() ''' 输出结果 [('hello', 1), ('world', 1), ('hello', 1), ('cruel', 1), ('hello', 1), ('hello', 1), ('beautiful', 1), ('world', 1)] [('hello', <pyspark.resultiterable.ResultIterable object at 0x000002E04B3DBEF0>), ('beautiful', <pyspark.resultiterable.ResultIterable object at 0x000002E04B3DBF28>), ('world', <pyspark.resultiterable.ResultIterable object at 0x000002E04B3DBF98>), ('cruel', <pyspark.resultiterable.ResultIterable object at 0x000002E04B3E2048>)] [('hello', [1, 1, 1, 1]), ('beautiful', [1]), ('world', [1, 1]), ('cruel', [1])] 因此将返回的迭代器进行一个list,会发现有很多的1,代表hello出现了4次,beautiful出现了1次,world出现了1次,cruel出现了1次 ''' # 5.reduceByKey ''' 把相同的key的数据分发到一起进行一个计算 和groupByKey类似,这个是在前者key出现的次数的基础上进行了一个汇总 ''' def my_reduceByKey(): data = ["hello world", "hello cruel hello", "hello beautiful world"] rdd = sc.parallelize(data).flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)) reduceByKeyRdd = rdd.reduceByKey(lambda x, y: x+y) print(reduceByKeyRdd.collect()) my_reduceByKey() ''' 输出结果 [('hello', 4), ('beautiful', 1), ('world', 2), ('cruel', 1)] 可以看到可以将出现的次数进行一个汇总 ''' # 6.sortByKey ''' 在reduceByKey的基础上进行排序 ''' def my_sortByKey(): data = ["hello world", "hello cruel hello", "hello beautiful world"] rdd = sc.parallelize(data).flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)) reduceByKeyRdd = rdd.reduceByKey(lambda x, y: x+y) sortByKeyRdd = reduceByKeyRdd.map(lambda x: (x[1], x[0])).sortByKey(False).map(lambda x: (x[1], x[0])) print(sortByKeyRdd.collect()) my_sortByKey() ''' 输出结果 [('hello', 4), ('world', 2), ('beautiful', 1), ('cruel', 1)] ''' # 7.union ''' 将两个rdd进行合并 ''' def my_union(): rdd1 = sc.parallelize([1, 2, 3]) rdd2 = sc.parallelize([4, 5, 6]) print(rdd1.union(rdd2).collect()) my_union() ''' 输出结果 [1, 2, 3, 4, 5, 6] ''' # 8.distinct ''' 对rdd进行去重 ''' def my_distinct(): rdd1 = sc.parallelize([1, 3, 3, 4, 4, 6]) print(rdd1.distinct().collect()) my_distinct() ''' 输出结果 [4, 1, 6, 3] 注意,因为是并行计算所以不一定会有序 ''' # 9.join ''' 类似于关系型数据库里面的join ''' def my_join(): rdd1 = sc.parallelize([("A", "a1"), ("B", "b1"), ("C", "c1"), ("D", "d1")]) rdd2 = sc.parallelize([("A", "a2"), ("C", "c2"), ("C", "c3"), ("E", "e1")]) # 内连接 print(rdd1.join(rdd2).collect()) # 左外连接 print(rdd1.leftOuterJoin(rdd2).collect()) # 右外连接 print(rdd1.rightOuterJoin(rdd2).collect()) # 全连接 print(rdd1.fullOuterJoin(rdd2).collect()) my_join() ''' 输出结果 [('C', ('c1', 'c2')), ('C', ('c1', 'c3')), ('A', ('a1', 'a2'))] [('B', ('b1', None)), ('C', ('c1', 'c2')), ('C', ('c1', 'c3')), ('A', ('a1', 'a2')), ('D', ('d1', None))] [('C', ('c1', 'c2')), ('C', ('c1', 'c3')), ('A', ('a1', 'a2')), ('E', (None, 'e1'))] [('B', ('b1', None)), ('C', ('c1', 'c2')), ('C', ('c1', 'c3')), ('A', ('a1', 'a2')), ('D', ('d1', None)), ('E', (None, 'e1'))] ''' ''' 上面的是一些rdd的transformation操作,下面介绍rdd的action操作 ''' # 10.action ''' action的常用操作主要有:collect,count,take,reduce,saveAsTextFile,foreach ''' def my_action(): data = list(range(10)) rdd = sc.parallelize(data) # collect, 查看所有元素 print("rdd.collect():", rdd.collect()) # count, 获取元素的个数 print("rdd.count():", rdd.count()) # take, 获取元素的前几个 print("rdd.take(3):", rdd.take(3)) # max, 获取元素的最大值 print("rdd.max(): ", rdd.max()) # min, 获取元素的最小值 print("rdd.min(): ", rdd.min()) # sum, 获取元素的总和 print("rdd.sum(): ", rdd.sum()) # reduce, 和python里面的reduce类似,对每两个相邻的元素进行操作 print("rdd.reduce(lambda x, y: x*y): ", rdd.reduce(lambda x, y: x*y)) # 如果改成x+y,那么等同于rdd.sum() print("rdd.reduce(lambda x, y: x+y): ", rdd.reduce(lambda x, y: x+y)) # foreach, 可以用来打印每一个元素 rdd.foreach(lambda x: print(x)) my_action() ''' 输出结果 rdd.collect(): [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] rdd.count(): 10 rdd.take(3): [0, 1, 2] rdd.max(): 9 rdd.min(): 0 rdd.sum(): 45 rdd.reduce(lambda x, y: x-y): 0, 因为我们列表里面含有0,所以相乘的结果是零 rdd.reduce(lambda x, y: x+y): 45 1 6 7 8 9 2 3 4 5 依旧是无序的 '''
2.RDD的基本操作的更多相关文章
- spark RDD 的基本操作
好记性不如烂笔头,分享一下 Spark是一个计算框架,是对mapreduce计算框架的改进,mapreduce计算框架是基于键值对也就是map的形式,之所以使用键值对是人们发现世界上大部分计算都可以使 ...
- (2)RDD的基本操作
一.map操作,map(Transform) 二.collect操作,collect(Action) 三.使用PairRDD来做计算,类似key-value结构 采用groupByKey来.将资料按照 ...
- Spark里边:到底是什么RDD
RDD它是Spark基,它是最根本的数据抽象.http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf 它开着RDD文件.假设英语阅读太 ...
- Spark技术内幕:究竟什么是RDD
RDD是Spark最基本,也是最根本的数据抽象.http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf 是关于RDD的论文.如果觉得英 ...
- 5.1 RDD编程
一.RDD编程基础 1.创建 spark采用textFile()方法来从文件系统中加载数据创建RDD,该方法把文件的URL作为参数,这个URL可以是: 本地文件系统的地址 分布式文件系统HDFS的地址 ...
- spark使用02
1.rdd的初始化 1.1 读取文件来初始化rdd(通过sparkContext的textFile方法) 1.1.1 读取本地文件 SparkConf conf = new SparkConf().s ...
- 【原】1.1RDD源码解读(一)
1.RDD(Resilient Distributed DataSet)是Spark生态系统中最基本的抽象,代表不可变的.可并行操作的分区元素集合.RDD这个类有RDD系列所有基本的操作,比如map. ...
- Spark开发指南
原文链接http://www.sxt.cn/info-2730-u-756.html 目录 Spark开发指南 简介 接入Spark Java 初始化Spark Java 弹性分布式数据集 并行集合 ...
- sparkSQL实战详解
摘要 如果要想真正的掌握sparkSQL编程,首先要对sparkSQL的整体框架以及sparkSQL到底能帮助我们解决什么问题有一个整体的认识,然后就是对各个层级关系有一个清晰的认识后,才能真正的 ...
随机推荐
- 【集训试题】SiriusRen的卡牌 set
题意概述: 给出N张卡牌,每张有三个属性a,b,c,同时给出所有属性可能的最大值A,B,C.对于一张卡牌,当这张卡牌至少有两个属性大于另外一张卡牌的对应两个属性的时候,认为这张卡牌更加优秀.现在问有多 ...
- 数据结构6——DFS
一.相关定义 深度优先遍历,也有称为深度优先搜索,简称DFS.其实,就像是一棵树的前序遍历. 初始条件:图G所有顶点均未被访问过,任选一点v. 思想:是从一个顶点V1开始,沿着一条路一直走到底,如果发 ...
- uva 11526 H(n) (数论)
转载自 http://blog.csdn.net/synapse7/article/details/12873437 这道题我自己做的时候没有想到好的优化方法,提交的时候借鉴这篇文章的内容,转载如下: ...
- 轻量级权限管理系统——MVC基础
Microsoft Web 开发平台
- oracle带条件的Insert语句
背景 在一条记录完结时,自动向表中加入一条新的记录,采用的是事务处理,修改现有记录,并新增一条记录,直接采用的insert语句会报错 //主键冲突 unique constraint (XXXXXX) ...
- appendTo()方法和append()方法
appendTo() 方法在被选元素的结尾(仍然在内部)插入指定内容.
- BZOJ4531 && BJOI2014 trace
#include<cstdio> #include<cctype> using namespace std ; struct state { int len ; int p ; ...
- 【题解】HNOI2016树
大概最近写的这些题目都是仿生的代码……在这里先说明一下.可能比起做题记录来说更加像是学习笔记吧.之所以这样做主要还是因为感受到最近做的很多题目自己会做的都比较简单,不会做的又不敢触及,虽然也有所进步. ...
- Adore 解题报告
Adore 问题描述 小\(\text{w}\) 偶然间得到了\(1\)个 \(DAG\). 这个 \(DAG\) 有 \(m\) 层,第\(1\)层只有\(1\)个源点,最后\(1\)层只有\(1\ ...
- #define、const、typedef的区别
#define.const.typedef的区别 #define 并不是定义变量, 只是用来做文本替换 例如: #define PI 3.1415926 float angel; angel=30*P ...