Spark Low-Level API RDD学习笔记

什么是RDDs

英文全称Resilient Distributed Datasets,翻译弹性分布式数据集
Spark The Definitive Guide中是这么描述的:RDD represents an immutable, partitioned collection of records that can be operated on in parallel,个人的理解,rdd就是一类分布式对象集合,其中每个records就是一个对象,我们可以对这些对象进行分布式的运算。

1.RDDs类型

对于用户来说,我们只需要关注两种类型的RDDs,generic RDDkey-value RDD
RDD 5个方面的特性表征
1.A list of Paritions
2.A function for cumputing each split
3.A list of dependencies on other RDDs
4.对于key-value类型的RDD可以选择Partitioner,个人理解是用来定义hash规则的
5.

2.RDD创建

1.将dataframe转化为rdd, 此时转化得到的是Row类型的RDD

spark.range(10).rdd
spark.range(10).toDF("id").rdd.map(lambda row:row[0])

# 将rdd转化为dataframe
spark.range(10).rdd.toDF("id")

如果想实现其他类型可以使用flatMap:

df.select("").rdd.flatMap(lambda x:x)

通过flatMap操作,可以将rdd基本元素转化为类似list的格式
dataframe:
在这里插入图片描述
输出:
在这里插入图片描述
2.基于本地变量创建rdd

myCollection = "Spark The Definitive Guide : Big Data Processing Made Simple"\
.split(" ")
words = spark.sparkContext.parallelize(myCollection, 2) # 这里人为的划分了2个partition

# name rdd  to show up in the Spark UI according to a given name
words.setName("mywords")
words.name
# 显示 mywords

3.基于数据源

# 逐行的读取文本文件
spark.sparkContext.textFile("/some/textFiles")

3.一些RDD的常规操作

3.1 Tranformations

# filter
def startsWithS(individual):
   return individual.startswith("S")
rds.filter(lambda word: startsWithsS(word)).collect()

Map
Map是以元素粒度的数据转化:给定映射函数 f,map(f) 以元素为粒度对 RDD 做数据转换。其中 f 可以是带有明确签名的带名函数,也可以是匿名函数,必须注意的是它的形参类型必须与 RDD 的元素类型保持一致,而输出类型则任由开发者自行决定

# 匿名函数实现
# 这个例子输出是word,输出是一个tuple(word,word的第一个元素, word是否以S开头)
rds.map(lambda word:(word, word[0], word.startsWithS(word)))

# 命名函数

3.2 actions

spark rdd仍然是保持惰性执行的机制,actions方法可以让spark程序进行执行输出等操作

# reduce
spark.sparkContext.parallelize(range(1, 21)).reduce(lambda x,y:x+y) # 210

def wordLengthReducer(leftWord, rightWord):
	if len(leftWord) > len(rightWord):
		return leftWord
	else:
		return rightWord
words.reduce(wordLengthReducer)

rdd逐步读取到driver端

#toLocalIterator
for tmp in rdd.toLocalIterator():
    some_operator(tmp)

3.3 checkpointing

把rrd存到硬盘上,后面依赖此rdd的操作就可以直接在硬盘上而不是去追溯到rdd的原始数据源。这里的checkpoint有点像在硬盘里进行缓存。

spark.sparkContext.setCheckpointDir("/some/path/for/checkpointing")
words.checkpoint()

3.4 pipe

通过pipe方法我们可以使用系统命令去操作rdd。
其中RDD是按照分区进行输入,每个分区的每一行由一个换行符间隔。
pipe是实现的底层函数,其他的方法是基于pipe进行的。

# pipe
words.pipe("wc -l").collect()


# mapPartitions
# 把partition作为参数进行程序定义
words.mapPartitions(lambda part: [1]).sum() # 2

# mapPartitionsWithIndex
# 可以把partion的index和partition Iterator作为参数进行程序定义
def indexedFunc(partitionIndex, withinPartIterator):
    return ["partition: {} => {}".format(partitionIndex,
             x) for x in withinPartIterator]
words.mapPartitionsWithIndex(indexedFunc).collect()




思维导图
在这里插入图片描述

Reference:

  1. 零基础入门spark-极客时间
  2. Spark The Definitive Guide
  3. spark 官方API
  4. Spark如何读取一些大数据集到本地机器上
  5. Best practice for retrieving big data from RDD to local machine
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值