生成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(