一、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')]