flatmap算子:
# flatmap算子: 对rdd执行map操作,然后进行解除嵌套操作
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
# 准备一个RDD
rdd = sc.parallelize(["itheima itcast 666", "itheima itheima itcast", "python itheima"])
# 需求:将RDD数据里面的一个个单词提取出来
rdd2 = rdd.flatMap(lambda x: x.split(" "))
print(rdd2.collect()) # ['itheima', 'itcast', '666', 'itheima', 'itheima', 'itcast', 'python', 'itheima']
map算子:
# PySpark的数据计算,都是基于RDD对象来进行的,那么如何进行呢?
# 依赖,RDD对象内置丰富的 成员方法(算子)
#
# map方法:对RDD内的元素逐个处理,并返回一个新的RDD;接受一个处理函数,,可用lambda匿名函数快速编写
from pyspark import SparkConf, SparkContext
# 添加python解释器路径
# import os
# os.environ['PYSPARK_PYTHON'] = "python.exe" # python解释器路径
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
# 基于SparkConf类对象创建sparkContext类对象
sc = SparkContext(conf=conf)
# 准备一个RDD
rdd = sc.parallelize([1, 2, 3, 4, 5])
# 通过map方法将全部数据都乘以10
# def func(data):
# return data * 10
# rdd2 = rdd.map(func) # (T) -> U : 表示func函数必须有一个参数和一个返回值
# print(rdd2.collect()) # [10, 20, 30, 40, 50]
# 匿名函数
# rdd2 = rdd.map(lambda x: x * 10)
# print(rdd2.collect())
# 链式调用
rdd3 = rdd.map(lambda x: x * 10).map(lambda x: x + 5)
print(rdd3.collect()) # [15, 25, 35, 45, 55]
sc.stop()
reduceByKey算子:
# reduceByKey算子:针对KV型(二元元组),自动按照key分组,根据提供的聚合逻辑,完成组内数据(value)的聚合操作
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
# 准备一个RDD
rdd = sc.parallelize([("男", 99), ("男", 88), ("女", 99), ("女", 66)])
# 求男生和女生两个组的成绩之和
rdd2 = rdd.reduceByKey(lambda a, b: a + b)
print(rdd2.collect()) # [('女', 165), ('男', 187)]
distinct算子: 去重
# distinct: 对RDD数据进行去重,返回新的RDD
# 语法:rdd.distinct() # 无需传参
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
rdd = sc.parallelize([1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8])
rdd2 = rdd.distinct()
print(rdd2.collect())
filter算子:过滤
# Filter: 过滤想要的数据进行保留,得到True保留至返回值的RDD中
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
rdd = sc.parallelize([1, 2, 3, 4, 5])
rdd2 = rdd.filter(lambda num: num % 2 == 0) # [2, 4]
print(rdd2.collect())
sortBy算子:排序
# sortBy算子:对RDD数据进行排序,基于指定的排序依据
# 语法:rdd.sortBy(func,ascending=False,numpartitions=1)
# func: (T) -> U: 告知按照rdd中的哪个数据进行排序,比如lambda x:x[1] 表示按照rdd中的第1列元素进行排序
# ascending :False降序 True升序
# numpartitions: 用多少分区排序
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
# 读数据
rdd = sc.textFile("./test.txt")
# 取单词
word_rdd = rdd.flatMap(lambda x: x.split(" "))
# print(word_rdd.collect())
# 准换成二元元组,单词为key,value为1
word_with_one_rdd = word_rdd.map(lambda word: (word, 1))
# print(word_with_one_rdd.collect())
# 统计分组结果
result = word_with_one_rdd.reduceByKey(lambda a, b: a + b)
# print(result.collect())
# 排序
final_add = result.sortBy(lambda x: x[1], ascending=False, numPartitions=1)
print(final_add.collect())
小案例1:
# 案例:统计每个单词数量
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
# 读数据
rdd = sc.textFile("./test.txt")
# 取单词
word_rdd = rdd.flatMap(lambda x: x.split(" "))
# print(word_rdd.collect())
# 准换成二元元组,单词为key,value为1
word_with_one_rdd = word_rdd.map(lambda word: (word, 1))
# print(word_with_one_rdd.collect())
# 统计分组结果
result = word_with_one_rdd.reduceByKey(lambda a, b: a + b)
print(result.collect())