PySpark案例实战

一、前言介绍





二、基础准备

python 复制代码
# 导包
from pyspark import SparkConf,SparkContext
#创建SparkConf类对象
conf=SparkConf().setMaster("local[*]").setAppName("test_spark_app")
#基于SparkXConf类对象创建SparkContext对象
sc=SparkContext(conf=conf)
#打印PySpark的运行版本
print(sc.version)
#停止SparkContext对象的运行(停止pySpark程序)
sc.stop()





三、数据输入

python 复制代码
from pyspark import SparkConf,SparkContext
 
conf=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=conf)
 
# 通过parallelize方法将Python对象加载到Spark内,成为RDD对象
rdd1=sc.parallelize([1,2,3,4,5])
rdd2=sc.parallelize((1,2,3,4,5))
rdd3=sc.parallelize("abcdefg")
rdd4=sc.parallelize({1,2,3,4,5})
rdd5=sc.parallelize({"key1":"value1","key2":"value2"})
 
#如果要查看RDD里面有什么内容,需要用collect()方法
print(rdd1.collect())
print(rdd2.collect())
print(rdd3.collect())
print(rdd4.collect())
print(rdd5.collect())
 
 
sc.stop()

注意:字符串返回的是['a','b','c','d','e','f','g'] 字典返回的是['key1','key2']

读取hello.txt的内容:

python 复制代码
from pyspark import SparkConf,SparkContext
 
conf=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=conf)
 
# # 通过parallelize方法将Python对象加载到Spark内,成为RDD对象
# rdd1=sc.parallelize([1,2,3,4,5])
# rdd2=sc.parallelize((1,2,3,4,5))
# rdd3=sc.parallelize("abcdefg")
# rdd4=sc.parallelize({1,2,3,4,5})
# rdd5=sc.parallelize({"key1":"value1","key2":"value2"})
#
# #如果要查看RDD里面有什么内容,需要用collect()方法
# print(rdd1.collect())
# print(rdd2.collect())
# print(rdd3.collect())
# print(rdd4.collect())
# print(rdd5.collect())
 
 
#用textFile方法,读取文件数据加载到Spark内,成为RDD对象
rdd=sc.textFile("C:/Users/GYH/Desktop/data/pyspark_heima/hello.txt")
print(rdd.collect())
sc.stop()




三、数据计算

3.1 map方法

python 复制代码
from pyspark import SparkConf,SparkContext
import os
os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置
 
conf=SparkConf().setMaster("local[*]").setAppName("test_spark")
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
                   #(T) -> T
print(rdd2.collect())
#链式调用
 

注意:

复制代码
import os
os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置

代码中:

java 复制代码
 def func(data):
     return data*10

可以替换成lambda

java 复制代码
rdd2=rdd.map(lambda x:x*10)

完整代码:

java 复制代码
from pyspark import SparkConf,SparkContext
import os
os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置
 
conf=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=conf)
 
# 准备一个RDD
rdd=sc.parallelize([1,2,3,4,5])
 
#通过map方法将全部数据都乘以10
# def func(data):
#     return data*10
 
rdd2=rdd.map(lambda x:x*10) #(T) -> U
                            #(T) -> T
print(rdd2.collect())
#链式调用
 

链式调用 可以直接使用.的方式

java 复制代码
rdd2=rdd.map(lambda x:x*10).map(lambda x:x+5)

完整代码:

python 复制代码
from pyspark import SparkConf,SparkContext
import os
os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置
 
conf=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=conf)
 
# 准备一个RDD
rdd=sc.parallelize([1,2,3,4,5])
 
#通过map方法将全部数据都乘以10
# def func(data):
#     return data*10
 
rdd2=rdd.map(lambda x:x*10).map(lambda x:x+5) #(T) -> U
                            #(T) -> T
print(rdd2.collect())
#链式调用
 




3.2 flatMap方法


java 复制代码
from pyspark import SparkConf,SparkContext
import os
os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置
 
conf=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=conf)
 
# 准备一个RDD
rdd=sc.parallelize(["itheima itcast 666","itheima itheima it cast","python itheima"])
#需求,将RDD数据里面的一个个单词提取出来
rdd2=rdd.map(lambda x:x.split(" "))
rdd1=rdd.flatMap(lambda x:x.split(" "))
print(rdd1.collect())
print(rdd2.collect())

flatMap算子

计算逻辑和map一样

可以比map多出,接触一层嵌套的功能

3.3 reduceByKey算子

reduceBeKey中的聚合逻辑是:

1,2,3,4,5\] 然后聚合函数:lambda a,b:a+b a b 1+2=3 3+3=6 6+4=10 10+5=15 ```java from pyspark import SparkConf,SparkContext import os os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置 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()) ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/4cb6ddeb9e8400355cfa06424e5f946f.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/c5074daa8986fb99d4f69f2d680c25f9.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/75ed5b3a2ffbd84efbecb3961a3fd7e7.webp) ### 3.4 数据计算练习案例 要求: # 完成单词计数统计 # 1.构建执行环境入口对象 # 2.读取数据文件 # 3.取出全部单词 # 4.将所有单词都转换为二元元组,单词为Key value 设置为1 # 5.分组并求和 # 6.打印输出 ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/0ecf6cd8053dc421979c1e13d2791c45.webp) ```java # 完成单词计数统计 # 1.构建执行环境入口对象 from pyspark import SparkConf,SparkContext import os os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置 conf=SparkConf().setMaster("local[*]").setAppName("test_spark") sc=SparkContext(conf=conf) #2.读取数据文件 rdd=sc.textFile("C:/Users/GYH\Desktop/data/pyspark_heima/hello.txt") #3.取出全部单词 word_rdd=rdd.flatMap(lambda x:x.split(" ")) # print(word_rdd.collect()) #4.将所有单词都转换为二元元组,单词为Key value 设置为1 word_with_one_rdd=word_rdd.map(lambda word:(word,1)) # print(word_with_one_rdd.collect()) #5.分组并求和 result=word_with_one_rdd.reduceByKey(lambda a,b:a+b) #6打印输出 print(result.collect()) ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/ac60dbbfde29a6e3e43a5f8220c8a77f.webp) ### 3.5 filter方法 ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/c28633296a9c797ac4ba1bd7e86540d5.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/7964d3f08ce46e9263622ed4e9f36478.webp) ```java from pyspark import SparkConf,SparkContext import os os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置 conf=SparkConf().setMaster("local[*]").setAppName("test_spark") sc=SparkContext(conf=conf) #准备一个RDD rdd=sc.parallelize([1,2,3,4,5]) # 对RDD的数据进行过滤 rdd2=rdd.filter(lambda num:num%2==0) print(rdd2.collect()) ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/37dfc7bbdf1ab18b0b5bea285546a6ac.webp) ### 3.6 distinct方法 ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/bd2090d891cc9bc7c97ca83d3c89d9b5.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/42e57dbf7fce0dd244cc12e89788bddf.webp) ```java from pyspark import SparkConf,SparkContext import os os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置 conf=SparkConf().setMaster("local[*]").setAppName("test_spark") sc=SparkContext(conf=conf) #准备一个RDD rdd=sc.parallelize([1,1,3,3,5,5,7,8,8,9,10]) #对RDD的数据进行去重 rdd2=rdd.distinct() print(rdd2.collect()) ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/bd08f005b254cf867553fe19e0976009.webp) ### 3.7 sortBy方法 ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/a61e05983fa198460a9a7ad82842585a.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/5231b89257ece2bf1a5d22932ee77073.webp) rdd.sortBy(func,ascending=Flase,numPartition=1) #func(T)--\>U:告知按照rdd中的哪一个数据进行排序,比如lambda x:x\[1\]表示按照rdd中的第二列元素进行排序 #ascending True升序 Flase降序 #numPartitions:用多少分区排序 ```java from pyspark import SparkConf,SparkContext import os os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置 conf=SparkConf().setMaster("local[*]").setAppName("test_spark") sc=SparkContext(conf=conf) #1.读取文件 rdd=sc.textFile("C:/Users/GYH/Desktop/data/pyspark_heima/hello.txt") #2.取出全部单词 word_rdd=rdd.flatMap(lambda x:x.split(" ")) #3.将所有单词都转换为二元元组,单词为Key,value设置为1 word_with_one_rdd=word_rdd.map(lambda word:(word,1)) #4.分组并求和 ressult_rdd=word_with_one_rdd.reduceByKey(lambda a,b:a+b) print(ressult_rdd.collect()) #5.对结果进行排序 final_rdd=ressult_rdd.sortBy(lambda x:x[1],ascending=False,numPartitions=1) print(final_rdd.collect()) ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/55948cb56e123098dd10f29855f410e3.webp) ### 3.8 数据计算-练习案例2 ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/fbf0c32f8aaa3b79c23d4a8a79de9894.webp) ```java from pyspark import SparkConf,SparkContext import os import json os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置 conf=SparkConf().setMaster("local[*]").setAppName("test_spark") sc=SparkContext(conf=conf) # TODO 需求1 城市销售额排名 # 1.1 读取文件到RDD file_rdd=sc.textFile("C:/Users/GYH/Desktop/data/pyspark_heima/orders.txt") # 1.2 取出一个JSON字符串 json_str_rdd=file_rdd.flatMap(lambda x:x.split("|")) # print(json_str_rdd) # 1.3 将一个个JSON字符串转换为字典 dict_rdd=json_str_rdd.map(lambda x:json.loads(x)) print(dict_rdd.collect()) # 1.4 取出城市和销售数据 # (城市,销售额) city_with_money_rdd=dict_rdd.map(lambda x:(x['areaName'],int(x['money']))) # 1.5 按城市分组按销售聚合 city_result_edd=city_with_money_rdd.reduceByKey(lambda a,b:a+b) # 1.6 按销售额聚合结果进行排序 result1_rdd=city_result_edd.sortBy(lambda x:x[1],ascending=False,numPartitions=1) print(f"需求1的结果是{result1_rdd.collect()}") # TODO 需求2:取出城市有哪些商品类别在销售 # 2.1 取出全部的商品类别 category_rdd=dict_rdd.map(lambda x:x['category']).distinct() print(f"需求2的结果{category_rdd.collect()}") #2.2 对全部商品类别进行去重 # TODO 需求3 # 3.1过滤北京市的数据 beijing_data_rdd=dict_rdd.filter(lambda x:x['areaName']=='北京') # 3.2 取出全部商品类别 result3_rdd=beijing_data_rdd.map(lambda x:x['category']).distinct() print(f"需求3的结果:{result3_rdd.collect()}") # 3.3 进行商品类别去重 ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/91a7c9f3bc65b1f6afbb760fed776c61.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/ee45572495bbf36920d340f928d75599.webp) ## 四、数据输出输出为Python对象 ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/38111085e23a749bf02fcd95d9035473.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/fae4707aa0432c21aefb2712b0de4e77.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/a2403016bc65cf4212af955c06efbd6c.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/a446ac8b54572b7236243a888f2381fc.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/ae0d12e57e73264cf16a4d82e2cb44eb.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/51eabf518f7a2129e4d64c378d74bceb.webp) ```java 数据输出的方法 collect 将RDD内容转换为list reduce 对RDD内容进行自定义聚合 take 取出RDD的前N个元素组成list count 统计RDD元素个数 ``` ```java from pyspark import SparkConf,SparkContext import os import json os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置 conf=SparkConf().setMaster("local[*]").setAppName("test_spark") sc=SparkContext(conf=conf) #准备RDD rdd=sc.parallelize([1,2,3,4,5]) # collect算子,输出RDD为list的对象 rdd_list:list=rdd.collect() print(rdd_list) print(type(rdd_list)) # reduce 算子,对RDD进行两两聚合 num=rdd.reduce(lambda a,b:a+b) print(num) # take算子,取出RDD前N个元素,组成list返回 take_list=rdd.take(3) print(take_list) # count,统计rdd内有多少条数据,返回值为数字 number_count=rdd.count() print(f"rdd内有{number_count}个元素") sc.stop() ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/b2324baf053f01d8932637597627df0d.webp) ## 五、数据输出到文件中 **1、下载hadoop3.3.0压缩包 百度网盘:链接:https://pan.baidu.com/s/1y4a2w4D8zCzYKEDY9aPWtw 提取码:1234 hadoop3.3.0解压到任意位置即可 2、将haoop3.3.0的bin文件夹下的 hadoop.dll 复制到C:\\Windows\\System32中** ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/7c556783e966ffaafd331e72055668c0.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/030b92bffbdf64d67e5ab955819a22f7.webp) 在pycharm中添加如下代码 ```java os.environ['HADOOP_HOME']="E:/spark/hadoop-3.3.0" ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/535a4ca3eff6a84bf6c1119d395703fb.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/74329e39cf5cec8e82fb5af4c91d95c8.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/2c2c3c71bf6c864a0c7bf7a5e56d5064.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/36d2fc2ea4dcf8e7856d28cd32c92108.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/4ea942c2ef4aafc0b395f8ae346088d2.webp) ## 六、综合案例 ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/dbe875a598802f931c27188d50abdc13.webp) 读取文件转换成RDD,并完成: 打印输出:热门搜索时间段(小时精度)Top3 打印输出:统计黑马程序员关键字在哪个时段被搜索最多 将数据转换为JSON格式,写出文件 ```java from pyspark import SparkConf,SparkContext import os import json os.environ['PYSPARK_PYTHON']="C:/Users/GYH/AppData/Local/Programs/Python/Python310/python.exe" #python解释器的位置 os.environ['HADOOP_HOME']="E:/spark/hadoop-3.3.0" conf=SparkConf().setMaster("local[*]").setAppName("test_spark") conf.set("spark.default.parallelism","1") sc=SparkContext(conf=conf) # 读取文件转换成RDD # TODO 需求1:热门城市时间段TOP3(小时精度) file_rdd=sc.textFile("C:/Users/GYH/Desktop/data/pyspark_heima/SogouQ.txt") #1.1取出全部时间并转换为小时 #1.2转换为(小时,1)的二元元组 #1.3Key分组聚合Value #1.4排序(降序) #1.5取前3 result1=file_rdd.map(lambda x:x.split("\t")).\ map(lambda x:x[0][:2]).\ map(lambda x:(x,1)).\ reduceByKey(lambda a,b:a+b).\ sortBy(lambda x:x[1],ascending=False,numPartitions=1).\ take(3) print(f"需求1的结果:{result1}") ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/b76ee194ebbf145b5b1c8a86b0358af0.webp) **TODO 需求2:热门搜索词TOP3** ```java # TODO 需求2:热门搜索词TOP3 # 2.1 取出全部搜索词 # 2.2 (词,1) 二元元组 # 2.3 分组聚合 # 2.4 排序 # 2.5 TOP3 file_rdd=sc.textFile("C:/Users/GYH/Desktop/data/pyspark_heima/SogouQ.txt") result2=file_rdd.map(lambda x:x.split('\t')).\ map(lambda x:x[2]).\ map(lambda x:(x,1)).\ reduceByKey(lambda a,b:a+b).\ sortBy(lambda x:x[1],ascending=False,numPartitions=1).\ take(3) print(f"需求2的结果:{result2}") ``` ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/5fae92d9b2a3dc6f28380be5f4ee5f9a.webp) **TODO 需求3:统计黑马程序员关键字在什么时段被搜索的最多** ```java # TODO 需求3:统计黑马程序员关键字在什么时段被搜索的最多 # 3.1 过滤内容 只能保留黑马程序员关键字 # 3.2 转换为(小时,1)的二元元组 # 3.3 Key分组聚合Value # 3.4 排序(降序) # 3.5 取前1 file_rdd=sc.textFile("C:/Users/GYH/Desktop/data/pyspark_heima/SogouQ.txt") result3=file_rdd.map(lambda x:x.split("\t")).\ filter(lambda x:x[2]=='黑马程序员').\ map(lambda x:(x[0][:2],1)).\ reduceByKey(lambda a,b:a+b).\ sortBy(lambda x:x[1],ascending=False,numPartitions=1).\ take(1) print(f"需求3的结果{result3}") ``` **TODO 需求4:将数据转换为JSON格式,写到文件中** ```java # TODO 需求4:将数据转换为JSON格式,写到文件中 file_rdd=sc.textFile("C:/Users/GYH/Desktop/data/pyspark_heima/SogouQ.txt") # 4.1 转换为JSON格式的RDD # 4.2 写出为文件 file_rdd.map(lambda x:x.split("\t")).\ map(lambda x:{"time":x[0],"user_id":x[1],"key_word":x[2],"rank1":x[3],"rank2":x[4],"url":x[5]}).\ saveAsTextFile("C:/Users/GYH/Desktop/data/pyspark_heima/output1_JSON") ``` 打开output1_JSON文件夹下的part_00000 ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/e35fcb9d107420368048065075778a71.webp) 成功写入: ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/fbb90594b79b5d4adcd12e3c1c68bc74.webp) ## 七、分布式集群运行 ![在这里插入图片描述](https://file.jishuzhan.net/article/1770305038078447617/fdbbca3c159ebc1372c9d480b2340dbb.webp)

相关推荐
augenstern41627 分钟前
webpack重构优化
前端·webpack·重构
海拥✘30 分钟前
CodeBuddy终极测评:中国版Cursor的开发革命(含安装指南+HTML游戏实战)
前端·游戏·html
寧笙(Lycode)1 小时前
React系列——HOC高阶组件的封装与使用
前端·react.js·前端框架
asqq81 小时前
CSS 中的 ::before 和 ::after 伪元素
前端·css
拖孩1 小时前
【Nova UI】十五、打造组件库之滚动条组件(上):滚动条组件的起步与进阶
前端·javascript·css·vue.js·ui组件库
苹果电脑的鑫鑫2 小时前
element中表格文字剧中可以使用的属性
javascript·vue.js·elementui
Hejjon2 小时前
Vue2 elementUI 二次封装命令式表单弹框组件
前端·vue.js
一丝晨光2 小时前
数值溢出保护?数值溢出应该是多少?Swift如何让整数计算溢出不抛出异常?类型最大值和最小值?
java·javascript·c++·rust·go·c·swift
小堃学编程2 小时前
前端学习(3)—— CSS实现热搜榜
前端·学习
Wannaer3 小时前
从 Vue3 回望 Vue2:响应式的内核革命
前端·javascript·vue.js