【Spark】Spark常用方法总结2-RDD的使用(Python版本)

本文详细总结了Spark中RDD的各种操作,包括collect、collectAsMap、first、sample、map、flatMap、reduce、reduceByKey等,还涉及到了关联与join、计数、去重、过滤、聚合函数以及checkpoint、存储级别控制、自定义分区等内容,是理解Spark RDD操作的实用指南。
摘要由CSDN通过智能技术生成

生成RDD

rdd1 = sc.parallelize([['zhangsan', 'M', 29], ['lisi', 'F', 22], ['wangwu', 'M', 30]])
rdd2 = sc.textFile(r'E:\常用基础数据\po.csv')

collect、collectAsMap、first

collect获取全部rdd元素, 生成list
collectAsMap获取键值对, 如果RDD中同一个Key中存在多个Value,后面的value将会把前面的value覆盖
first 获取第一个元素

rdd1_list = rdd1.collect()

sample

withReplacement 取出后是否放回
fraction 取出比例
seed 随机数, 避免同一个程序里面多个随机取值太过相似
返回值为一个新的rdd

rdd1_sample = rdd1.sample(False, 0.6, 1)
print(rdd1_sample.collect())
sort 排序

ascending 正序排序, 默认为正序
numPartitions 分区数, 不知道干嘛的
keyfunc 获取key, 默认为tuple或者list的第一个

rdd1_sorted = rdd1.sortByKey(ascending=False)
rdd1_sorted2 = rdd1.sortBy(ascending=False, keyfunc=lambda x: x[1])
print(rdd1_sorted.collect())
print(rdd1_sorted2.collect())

map、flatMap, mapValues ,flatMapValues

对每一个元素进行处理, 参数为rdd中的元素个体, flatMap将map扁平化flat()
preservesPartitioning 是否保留父rdd的partitioner分区信息, 不知所云

rdd1_map = rdd1.map(lambda x: x[2])
print(rdd1_map.collect())
rdd2 = sc.parallelize([
    [1, 'yingyu', 89],
    [1, 'shuxue', 99],
    [1, 'zhengzhi', 78],
    [2, 'shuxue', 78],
    [2, 'zhengzhi', 89],
    [3, 'jisuanji', 97],
    [3, 'huaxue', 67],
    [100, 'shengwu', 68]
])

当key-value类型的rdd, 对每一个key中的value进行操作. key不变. 可以配合groupby

print(rdd1.mapValues(lambda x: len(x)))

比起上面的多一个拆分动作

print(rdd1.flatMapValues(lambda x: len(x))

reduce、reduceByKey、fold、foldByKey

reduce 不解释
fold是提供了初始值的reduce

关联与join

cartesian笛卡尔积, rdd1中的单个元素作为整体分别和rdd2全关联
join 两边都有的

rdd1_rdd2_join = rdd1.join(rdd2)
print(rdd1_rdd2_join.collect())

outerJoin, 数据最全, 没有的就关联空

rdd1.fullOuterJoin(rdd2)

leftOuterJoin 左边的都有, 不管右边有没有

rdd1_rdd2_left_outer_join = rdd1.leftOuterJoin(rdd2)

rightOuterJoin 右边的都有

rdd1_rdd2_left_outer_join = rdd1.rightOuterJoin(rdd2)

示例

rdd1 = sc.parallelize([[1, 'A'], [2, 'B'], [3, 'C'], [4, 'D'], [5, 'E']])
rdd2 = sc.parallelize([[1, 'a'], [1, 'b'], [3, 'c'], [4, 'd'], [8, 'e']])

result1 = rdd1.cartesian(rdd2).collect()
result2 = rdd1.join(rdd2).collect()
result3 = rdd1.fullOuterJoin(rdd2).collect(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值