【博学谷学习记录】超强总结,用心分享 | Spark Core入门

#博学谷IT技术支持#

一、RDD介绍

1.1 RDD概念

RDD:弹性分布式数据集

目的:支持更加高效的迭代计算操作

核心:采用多节点处理,将一个任务拆分为N个子任务,分别运行在不同的节点上并行处理,各个节点计算完成后将结果汇总处理。

说明:RDD是一个抽象数据模型,本身不存储任何数据,仅是一个数据传输的管道,使用者只需要告知RDD从哪里读,中间需要进行什么转换操作,最后结果输出到什么位置。

1.2 RDD特点

  1. RDD是可分区的
  2. RDD是只读的:RDD不可变
  3. RDD之间存在依赖关系
  4. RDD可以设置cache
  5. RDD可以设置checkpoint

1.3 RDD构建方式

  • 通过并行化方式构建
conf = SparkConf().setAppName("create_rdd_01").setMaster("local[2]")
sc = SparkContext(conf=conf)

rdd_init = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9, 10],3)
print(rdd_init.collect())
print(rdd_init.getNumPartitions()) # 获取这个RDD有多少个分区
print(rdd_init.glom().collect()) # 获取每个分区中的数据
sc.stop()
  • 通过读取外部数据源方式
conf = SparkConf().setAppName("create_rdd_02").setMaster("local[*]")
sc = SparkContext(conf=conf)

rdd_init = sc.textFile("file:///export/data/workspace/ky06_pyspark/_02_SparkCore/data/")
print(rdd_init.collect())
print(rdd_init.getNumPartitions())
print(rdd_init.glom().collect())

sc.stop()

二、RDD算子

2.1 RDD的转换算子

  • map算子:根据传入的函数,对数据进行一对一的转换操作,传入一行,返回一行。
rdd = sc.parallelize([1,2,3,4,5,6,7,8,9,10])

# 对每一个元素进行 +1 返回
rdd.map(lambda num: num + 1).collect()

# 结果
# [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
  • filter算子:根据函数中指定的过滤条件,返回True表示保留,返回False表示过滤
rdd = sc.parallelize([1,2,3,4,5,6,7,8,9,10])

# 将<=3的数据过滤掉
rdd.filter(lambda num: num > 3).collect()

#结果
# [4, 5, 6, 7, 8, 9, 10]
  • flatMap算子:一行中包含多个内容操作,实现一转多操作
rdd = sc.parallelize(['张三 李四 王五 赵六','田七 周八 李九'])

# 转换为一个个的姓名
rdd.flatMap(lambda line: line.split(' ')).collect()
# rdd.flatMap(lambda line: line.split()).collect()
# 结果
# ['张三', '李四', '王五', '赵六', '田七', '周八', '李九']
  • groupByKey算子:根据key进行分组操作
rdd = sc.parallelize([('c01','张三'),('c02','李四'),('c02','王五'),('c03','赵六'),('c02','田七'),('c02','周八'),('c03','李九')])

# 根据班级分组统计
rdd.groupByKey().collect()
结果
[
	('c01', <pyspark.resultiterable.ResultIterable object at 0x7f1a1bc0af10>), 
	('c02', <pyspark.resultiterable.ResultIterable object at 0x7f1a1bc0af40>), 
	('c03', <pyspark.resultiterable.ResultIterable object at 0x7f1a1bc0afd0>)
]

rdd.groupByKey().mapValues(list).collect()
结果:
[
	('c01', ['张三']), 
	('c02', ['李四', '王五', '田七', '周八']), 
	('c03', ['赵六', '李九'])]

rdd.groupByKey().mapValues(list).map(lambda kv: (kv[0],len(kv[1]))).collect()
结果:
[('c01', 1), ('c02', 4), ('c03', 2)]
  • reduceByKey算子:根据key分组,将一个组内的value数据放置到一个列表中,对列表基于传入函数进行聚合
rdd = sc.parallelize([('c01','张三'),('c02','李四'),('c02','王五'),('c03','赵六'),('c02','田七'),('c02','周八'),('c03','李九')])

# 统计每个班级有多少个人
rdd.map(lambda kv:(kv[0],1)).reduceByKey(lambda agg,curr: agg + curr).collect()
结果:
[('c01', 1), ('c02', 4), ('c03', 2)]


# 如果不转为1
rdd.reduceByKey(lambda agg,curr: agg + curr).collect()    
结果:
[('c01', '张三'), ('c02', '李四王五田七周八'), ('c03', '赵六李九')]
  • SortByKey算子:根据key进行排序,默认按照升序
rdd = sc.parallelize([('c03','张三'),('c05','李四'),('c01','王五'),('c09','赵六'),('c02','田七'),('c07','周八'),('c06','李九')])

# 根据班级序号排序
rdd.sortByKey().collect()
结果: 
[('c01', '王五'), ('c02', '田七'), ('c03', '张三'), ('c05', '李四'), ('c06', '李九'), ('c07', '周八'), ('c09', '赵六')]

rdd.sortByKey(ascending=False).collect()
结果:
[('c09', '赵六'), ('c07', '周八'), ('c06', '李九'), ('c05', '李四'), ('c03', '张三'), ('c02', '田七'), ('c01', '王五')]

rdd = sc.parallelize([('c03','张三'),('c05','李四'),('c011','王五'),('c09','赵六'),('c02','田七'),('c07','周八'),('c06','李九')])

rdd.sortByKey().collect()       
结果: 按照字典序因为key是字符串
[('c011', '王五'), ('c02', '田七'), ('c03', '张三'), ('c05', '李四'), ('c06', '李九'), ('c07', '周八'), ('c09', '赵六')]

2.2 RDD的动作算子

  • collect()算子:收集各个分区的数据汇总到一个列表中返回
  • reduce()算子:根据传入的函数进行聚合操作
  • first()算子:获取第一个元素
  • take()算子:获取前N个元素
  • top()算子:对数据集进行倒序排序,kv类型针对key排序,并获取前N个元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值