有些时候,我不太喜欢介绍相关概念什么的(其实是你懒吧),而是喜欢直接介绍用法。

所以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的基本操作的更多相关文章

  1. spark RDD 的基本操作

    好记性不如烂笔头,分享一下 Spark是一个计算框架,是对mapreduce计算框架的改进,mapreduce计算框架是基于键值对也就是map的形式,之所以使用键值对是人们发现世界上大部分计算都可以使 ...

  2. (2)RDD的基本操作

    一.map操作,map(Transform) 二.collect操作,collect(Action) 三.使用PairRDD来做计算,类似key-value结构 采用groupByKey来.将资料按照 ...

  3. Spark里边:到底是什么RDD

    RDD它是Spark基,它是最根本的数据抽象.http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf 它开着RDD文件.假设英语阅读太 ...

  4. Spark技术内幕:究竟什么是RDD

    RDD是Spark最基本,也是最根本的数据抽象.http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf 是关于RDD的论文.如果觉得英 ...

  5. 5.1 RDD编程

    一.RDD编程基础 1.创建 spark采用textFile()方法来从文件系统中加载数据创建RDD,该方法把文件的URL作为参数,这个URL可以是: 本地文件系统的地址 分布式文件系统HDFS的地址 ...

  6. spark使用02

    1.rdd的初始化 1.1 读取文件来初始化rdd(通过sparkContext的textFile方法) 1.1.1 读取本地文件 SparkConf conf = new SparkConf().s ...

  7. 【原】1.1RDD源码解读(一)

    1.RDD(Resilient Distributed DataSet)是Spark生态系统中最基本的抽象,代表不可变的.可并行操作的分区元素集合.RDD这个类有RDD系列所有基本的操作,比如map. ...

  8. Spark开发指南

    原文链接http://www.sxt.cn/info-2730-u-756.html 目录 Spark开发指南 简介 接入Spark Java 初始化Spark Java 弹性分布式数据集 并行集合 ...

  9. sparkSQL实战详解

    摘要   如果要想真正的掌握sparkSQL编程,首先要对sparkSQL的整体框架以及sparkSQL到底能帮助我们解决什么问题有一个整体的认识,然后就是对各个层级关系有一个清晰的认识后,才能真正的 ...

随机推荐

  1. Micro Average vs Macro average Performance in a Multiclass classification setting

    整理摘自 https://datascience.stackexchange.com/questions/15989/micro-average-vs-macro-average-performanc ...

  2. 在 C/C++ 中使用 TensorFlow 预训练好的模型—— 直接调用 C++ 接口实现

    现在的深度学习框架一般都是基于 Python 来实现,构建.训练.保存和调用模型都可以很容易地在 Python 下完成.但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将通过直 ...

  3. BZOJ 3531 SDOI2014 旅行 树链剖分+线段树动态开点

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3531 题意概述: 给出一棵N个点的树,树上的每个结点有一个颜色和权值,支持以下四种操作: ...

  4. 【转】Virtual DOM

    前言 React 好像已经火了很久很久,以致于我们对于 Virtual DOM 这个词都已经很熟悉了,网上也有非常多的介绍 React.Virtual DOM 的文章.但是直到前不久我专门花时间去学习 ...

  5. STL中list的erase()方法

    http://www.cnblogs.com/gshlsh17/ rase()方法是删除iterator指定的节点  但是要注意的是在执行完此函数的时候iterator也被销毁了   这样的话关于it ...

  6. valgrind使用

    参数配置 gcc -g: 增加调试信息,供valgrind精确定位. -O0:关闭gcc优化:优化产生的代码可能会造成valgrind误判. valgrind --leak-check=full no ...

  7. [C/C++] “箭头(->)”和“点号(.)”的区别

    转自:http://blog.csdn.net/gyymen/article/details/4962873 首先介绍一下C++中的结构.对于一个结构: struct MyStruct { int m ...

  8. HTML5调用手机摄像头,仅仅支持OPPOHD浏览器

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. [NOI2017]游戏 2-sat

    ---题面--- 题解: 首先观察到,如果没有x的话,这就是一个2-sat问题. 建图方式:对于限制d1 c1 d2 c2,其中d1, d2分别代表比赛编号,c1, c2代表出场的赛车. 1,如果d1 ...

  10. 排查nginx、tomcat内存和服务器负载之后

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...