第四章 Spark RDD

学习目标:

熟悉 Spark RDD 的使用方法。


学习原理:

RDD(Resilient Distributed Datasets)可扩展的弹性分布式数据集,RDD是spark最基本的数据抽象,RDD表示一个只读、分区且不变的数据集合,是一种分布式的内存抽象,与分布式共享内存(Distributed Shared Memory,DSM)都是分布式的内存抽象,但两者是不同的。RDD支持两种类型的操作: transformations(转换)和 actions(动作)。transformations操作会在一个已存在的 RDD上创建一个新的 RDD,但实际的计算并没有执行,仅仅记录操作过程,所有的计算都发生在actions环节。actions操作触发时,会执行 RDD记录的所有运行transformations操作,并计算结果,结果可返回到 driver 程序,也可保存的相关存储系统中。

RDD产生背景


为了解决开发人员能在大规模的集群中以一种容错的方式进行内存计算,提出了 RDD 的概念,而当前的很多框架对迭代式算法场景与交互性数据挖掘场景的处理性能非常差, 这个是RDDs 的提出的动机。

什么是 RDD


RDD 是 Spark 的计算模型。RDD(Resilient Distributed Dataset)叫做弹性的分布式数据集合,是 Spark 中最基本的数据抽象,它代表一个不可变、只读的,被分区的数据集。操作 RDD 就像操作本地集合一样,有很多的方法可以调用,使用方便,而无需关心底层的调度细节。
 

RDD的五个主要属性 


分区信息 
Compute函数
Partitioner函数
优先位置列表 
依赖关系 
 

RDD的基本操作

1)RDD创建

pyspark

 

 从列表创建 RDD

data=[1,2,6,4,7,3] 
rdd=sc.parallelize(data) 
rdd.collect()

 

从文本文件创建 RDD

distFile=sc.textFile("/home/ubuntu/Desktop/book.txt")
type(distFile)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YiY5paw5rqQODcw,size_20,color_FFFFFF,t_70,g_se,x_16

2)RDD 转换

#count 操作,返回RDD中元素的个数。

sc.parallelize([2,3,4]).count() 

#countByKey 操作,每个键对应的元素的个数,返回数据类型为字典类型

rdd=sc.parallelize([("a",1),("b",1),("a",1)])
sorted(rdd.countByKey().items()) 

#countByValue,返回RDD中每一个唯一值的个数,返回类型为字典类型

sorted(sc.parallelize([1,2,1, 2, 2], 2).countByValue().items()) 

#distinct,去除RDD中重复的元素。

sorted(sc.parallelize([1,1,2,3]).distinct().collect()) 

# filter,过滤符合自定义条件的 RDD元素 

rdd=sc.parallelize([1,2, 3, 4,5]) 
rdd.filter(lambda x:x%2== 0).collect() 

#first,返回RDD中的第一个元素,当RDD 为空时抛出RDD为空的异常。

sc.parallelize([2,3, 4]).first() 

sc.parallelize([]).first()

#flatMap,对RDD每个输入元素生成多个输出元素,和 map() 类似,我们提供给 flatMap() 的函数被分别应用到了输入 RDD 的每个元素上。不 过返回的不是一个元素,而是一个返回值序列的迭代器。
 rdd=sc.parallelize([2,3, 4])
sorted(rdd.flatMap(lambda x:range(1,x)).collect()) 

sorted(rdd.flatMap(lambda x:[(x,x), (x,x)]).collect()) 

#foreach,对 RDD内的每一个元素进行处理,可以自定义处理函数,将函数名作为参数传递 

def f(x): print(x) 
sc.parallelize([1,2, 3,4,5]).foreach(f)

#groupBy,按照自定义条件对 RDD内的元素进行分组

rdd=sc.parallelize([1,1, 2, 3,5,8]) 
result= rdd.groupBy(lambda x:x% 2).collect()
sorted([(x,sorted(y)) for (x,y) in result]) 
#isEmpty,判断 RDD是否为空

sc.parallelize([]).isEmpty() 

#map,对 RDD内的每一个元素进行并行处理。

rdd=sc.parallelize(["b","a","c"])
sorted(rdd.map(lambda x: (x,1)).collect()) 

#reduceByKey,把相同键的数据加和起来

from operator import add
rdd=sc.parallelize([("a", 1), ("b", 1), ("a",1)]) 
sorted(rdd.reduceByKey(add).collect()) 

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YiY5paw5rqQODcw,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YiY5paw5rqQODcw,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YiY5paw5rqQODcw,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YiY5paw5rqQODcw,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘新源870

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值