Spark RDD常用算子-Transformation(Python版)

一、RDD的创建

1.1. 通过并行化集合创建 (本地对象转分布式RDD)

data = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
rdd = sc.parallelize(data, numSlices=3)
print(rdd.getNumPartitions())   #打印分区数
print(rdd.glom().collect()) 

numSlices表示设置分区数,不设置时会根据CPU核来确定

1.2 读取外部数据源 (读取文件)

path = '  '      # hdfs://ip:8020/
rdd = sc.textFile(path, minPartitions)

外部数据路径可以是本地文件数据也可以是分布式文件数据(HDFS,S3等)
textFile中的minPartitions设置的为最小分区数,若设置太大,此参数将无效。

1.3. 读取一堆小文件

rdd = sc.wholeTextFiles(path, minPartitions)

这个API偏向于少量分区读取数据。因为这个API表明了自己是小文件读取专用,若文件的数据很小分区很多,会导致shuffle的几率更高.所以尽量少分区读取数据。

二、 Transformation算子

使用Transformation算子的RDD返回值仍然是RDD。这类算子的lazy 懒加载的,没有Action算子,Transformation算子是不工作的。
2.1. map
将RDD中得数据一条条地进行处理,并返回新的RDD。

dataRDD = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9])

def map_func(data):    
    return data * 10
    
print(dataRDD.map(map_func).collect())

print(dataRDD.map(lambda x: x * 10).collect())  # 匿名lambda写法

RESULT: [10, 20, 30, 40, 50, 60, 70, 80, 90]


2.2. flatMap
对RDD执行map操作,然后进行解除嵌套操作。

dataRDD = sc.parallelize(["Hadoop Spark Scala", "Java Hadoop"])

flatMapRDD = dataRDD.flatMap(lambda x: x.split(' '))

print(flatMapRDD.collect())

RESULT: [‘Hadoop’, ‘Spark’, ‘Scala’, ‘Java’, ‘Hadoop’]


2.3. filter
过滤想要的数据

dataRDD = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9])

result = dataRDD.filter(lambda x: x % 2 == 0).collect()

print(result)

RESULT: [2, 4, 6, 8]


2.4. distinct
对RDD数据进行去重处理从返回新的RDD, 此算子一般不需要传参。

dataRDD = sc.parallelize([1, 2, 1, 1, 1, 3, 4, 2, 3, 5, 5, 5, 5, 6, 7, 8, 9])

result = dataRDD.distinct().collect()

print(result)

RESULT: [1, 2, 3, 4, 5, 6, 7, 8, 9]


2.5. union
将两个RDD合并成一个RDD

dataRDD1 = sc.parallelize([1, 2, 1, 1, 1, 3, 4, 2, 3])

dataRDD2 = sc.parallelize([5, 5, 5, 5, 6, 7, 8, 9])

dataRDD = dataRDD1.union(dataRDD2).collect()

print(dataRDD)

RESULT: [1, 2, 1, 1, 1, 3, 4, 2, 3, 5, 5, 5, 5, 6, 7, 8, 9]


2.6. intersection
求两个RDD的交集

dataRDD1 = sc.parallelize([1, 2, 1, 1, 1, 3, 4, 2, 3])

dataRDD2 = sc.parallelize([5, 5, 4, 1, 6, 7, 3, 9])

dataRDD = dataRDD1.intersection(dataRDD2).collect()

print(dataRDD)

RESULT: [1, 3, 4]


2.7. join
对两个RDD执行jion操作(内外链接),jion算子只能用于kv型RDD
jion 内连接
leftOuterJoin 左外连接
rightOuterJoin 右外连接

dataRDD1 = sc.parallelize([(1, 'hadoop'), (2, 'spark'), (3, 'flink')])
dataRDD2 = sc.parallelize([(1, 'java'), (2, 'python')])

# 内连接
dataJionRDD = dataRDD1.join(dataRDD2).collect()
# [(1, ('hadoop', 'java')), (2, ('spark', 'python'))]

# 左外连接
dataLeftJionRDD = dataRDD1.leftOuterJoin(dataRDD2).collect()
# [(1, ('hadoop', 'java')), (2, ('spark', 'python')), (3, ('flink', None))]

2.8. glom
按照分区将RDD数据加上嵌套

dataRDD = sc.parallelize([1, 2, 1, 1, 1, 3, 4, 2, 3, 5, 5, 5, 5, 6, 7, 8, 9], 3)
result = dataRDD.glom().collect()

# [[1, 2, 1, 1, 1], [3, 4, 2, 3, 5], [5, 5, 5, 6, 7, 8, 9]]

2.9. reduceByKey
针对K-V型的RDD,先根据key分组,然后根据提供的聚合逻辑对value进行聚合操作。

dataRDD = sc.parallelize(["Hadoop Spark Scala", "Java Hadoop"])

flatMapRDD = dataRDD.flatMap(lambda x: x.split(' '))

kvRDD = flatMapRDD.map(lambda x: (x, 1))

result = kvRDD.reduceByKey(lambda a, b: a + b).collect()

print(result)

RESULT: [(‘Java’, 1), (‘Hadoop’, 2), (‘Spark’, 1), (‘Scala’, 1)]


2.10. groupBy
将RDD数据进行分组

dataRDD = sc.parallelize([(1, 'hadoop'), (1, 'spark'), (2, 'java'), (2, 
'scala'), (2, 'python'), (3, 'SQL')])

# 根据key进行分组
groupByKeyRDD = dataRDD.groupBy(lambda x: x[0])

result = groupByKeyRDD.map(lambda x: (x[0], list(x[1]))).collect()

print(result)

RESULT: [(1, [(1, ‘hadoop’), (1, ‘spark’)]), (2, [(2, ‘java’), (2, ‘scala’), (2, ‘python’)]), (3, [(3, ‘SQL’)])]

# 根据value进行分组
kv2vkRDD = dataRDD.map(lambda x: (x[1], x[0]))

groupByValueRDD = kv2vkRDD.groupBy(lambda x: x[1])

result = groupByValueRDD.map(lambda x: (x[0], list(x[1]))).collect()

print(result)

RESULT: [(1, [(‘hadoop’, 1), (‘spark’, 1)]), (2, [(‘java’, 2), (‘scala’, 2), (‘python’, 2)]), (3, [(‘SQL’, 3)])]


2.11. groupByKey
针对K-V型RDD,自动按照key进行分组

dataRDD = sc.parallelize([(1, 'hadoop'), (1, 'spark'), (2, 'java'), (2, 
'scala'), (2, 'python'), (3, 'SQL')])
groupByKeyRDD = dataRDD.groupByKey()
result = groupByKeyRDD.map(lambda x: (x[0], list(x[1]))).collect()

# [(1, ['hadoop', 'spark']), (2, ['java', 'scala', 'python']), (3, ['SQL'])]

2.12. sortBy
按照指定的排序依据对RDD数据进行排序

dataRDD = sc.parallelize([(3, 'SQL'), (1, 'hadoop'), (2, 'java'), (1, 
'spark'), (2, 'scala'), (2, 'python')])
sortByKeyRDD = dataRDD.sortBy(lambda x: x[0], ascending=True)
result = sortByKeyRDD.collect()

# [(1, 'hadoop'), (1, 'spark'), (2, 'java'), (2, 'scala'), (2, 'python'), (3, 'SQL')]

参数ascending为True表示升序,False表示降序


2.13. sortByKey
按照key对RDD数据进行排序

dataRDD = sc.parallelize([(3, 'SQL'), (1, 'hadoop'), (2, 'java'), (1, 
'spark'), (2, 'scala'), (2, 'python')])
sortByKeyRDD = dataRDD.sortByKey(ascending=True)
result = sortByKeyRDD.collect()

# [(1, 'hadoop'), (1, 'spark'), (2, 'java'), (2, 'scala'), (2, 'python'), (3, 'SQL')]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值