Apache的Spark是用于大规模数据处理的统一(unified)分析引擎,简单来讲Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB,PB乃至EB级别的海量数据。
Spark作为全球顶级的分布式计算框架,支持众多的编程语言进行开发。而python语言则是Spark重点支持的对象。重点体现在python的第三方库PySpark。
如果想要使用pyspark库完成数据的处理,首先要构建一个执行环境的入口对象。PySpark的执行环境入口对象是:类SparkContext的类对象。
# 导包
from pyspark import SparkConf, SparkContext
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf类对象创建SparkContext对象
sc = SparkContext(conf=conf)
# 打印PySpark的运行版本
print(sc.version)
# 停止SparkContext对象的运行(停止PySpark程序)
sc.stop()
运行后报错:
Java gateway process exited before sending its port number
解决方案:
(1)由于电脑中没有配置Java环境导致出错,只需要去官网下载Java的jdk并安装,然后配置好环境变量即可。
(2)jdk安装位置:
(3)环境变量配置:
path目录下:
(4)重启PyCharm,运行程序
(1)SparkContext类对象是PySpark编程中一切功能的入口,都是通过此对象调用类中的一些方法使用。
三大步:
(1)PySpark支持通过SparkContext对象的parallelize方法将list,tuple,set,dic,str转换为RDD对象。
from pyspark import SparkConf,SparkContext
conf=SparkConf().setMaster("local[*]").setAppName("test_date_input")
#得到入口对象
scn=SparkContext(conf=conf)
list=[1,2,3,4,5,6]
#出入数据
rdd1=scn.parallelize(list)
rdd2=scn.parallelize((1,2,3,4,5,6))
rdd3=scn.parallelize("abcdef")
rdd4=scn.parallelize({"key1": "value1", "key2": "value2"})
#通过collect()查看RDD中的内容
print(rdd1.collect())
print(rdd2.collect())
print(rdd3.collect())
print(rdd4.collect())
scn.stop()
注意:字符串会被拆分出一个个的字符,存入RDD对象,字典仅key会被存入RDD对象。
(2)读取文件转换为RDD对象
#读取文件
from pyspark import SparkConf,SparkContext
conf=SparkConf().setMaster("local[*]").setAppName("test_date_input")
#得到入口对象
scn=SparkContext(conf=conf)
rdd=scn.textFile("E:\pythonProject/test1.txt")
print(rdd.collect())
RDD中含有丰富的计算成员方法(算子)
rdd.map(func)
当代码写到这一步如果直接运行仍会报错。
from pyspark import SparkConf,SparkContext
con=SparkConf().setMaster("local[*]").setAppName("map_test")
sc=SparkContext(conf=con)
#准备RDD数据
rdd1=sc.parallelize([1,2,3,4])
#通过map()方法将列表元素都乘10
def func(x):
return x * 10
rdd2=rdd1.map(func)
print(rdd2.collect())
sc.stop()
#设置环境变量,运行时可以找到python解释器
import os
os.environ['PYSPARK_PYTHON']="E:\Python_setup\python3.10\python.exe"
from pyspark import SparkConf,SparkContext
#设置环境变量,运行时可以找到python解释器
import os
os.environ['PYSPARK_PYTHON']="E:\Python_setup\python3.10\python.exe"
con=SparkConf().setMaster("local[*]").setAppName("map_test")
sc=SparkContext(conf=con)
#准备RDD数据
rdd1=sc.parallelize([1,2,3,4])
#通过map()方法将列表元素都乘10
def func(x):
return x * 10
rdd2=rdd1.map(func)
print(rdd2.collect())
sc.stop()
"""
演示RDD的map成员方法的使用
"""
from pyspark import SparkConf, SparkContext
import os
os.environ['PYSPARK_PYTHON'] = "E:\Python_setup\python3.10\python.exe"
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)
print(rdd2.collect())
# (T) -> U
# (T) -> T
# 链式调用
from pyspark import SparkConf,SparkContext
import os
os.environ["PYSPARK_PYTHON"]="E:\Python_setup\python3.10\python.exe"
con=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=con)
#准备RDD
rdd=sc.parallelize(["hello world","python 666"])
#需求:将RDD数据列表一个个单词提出来
rdd2=rdd.map(lambda date:date.split(" "))
print(rdd2.collect())
sc.stop()
rdd2=rdd.flatMap(lambda date:date.split(" "))
from pyspark import SparkConf,SparkContext
import os
os.environ["PYSPARK_PYTHON"]="E:\Python_setup\python3.10\python.exe"
con=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=con)
rdd=sc.parallelize([('男',99),('男',89),('女',86),('女',95)])
#求男生和女生两个组的成绩之和
rdd2=rdd.reduceByKey(lambda a,b:a+b)
print(rdd2.collect())
sc.stop()
from pyspark import SparkConf,SparkContext
import os
os.environ["PYSPARK_PYTHON"]="E:\Python_setup\python3.10\python.exe"
con=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=con)
#01读文件
rdd1=sc.textFile("E:\pythonProject/hello.txt")
# print(rdd1.collect())
#02取出每个单词,存入单个列表,而不是嵌套列表
word_rdd2=rdd1.flatMap(lambda x:x.split(" "))
# print(word_rdd2.collect())
#03将列表中单词转换成 双元元组('itheima',1), 'itheima',1), ('itcast', 1),以便使用reduceBykey进行数量统计
tulpe_word_rdd3=word_rdd2.map(lambda word:(word,1))
# print(tulpe_word_rdd3.collect())
#04统计数量
num_rdd4=tulpe_word_rdd3.reduceByKey(lambda a,b:a+b)
print(num_rdd4.collect())
sc.stop()
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple psutil
from pyspark import SparkConf,SparkContext
import os
os.environ["PYSPARK_PYTHON"]="E:\Python_setup\python3.10\python.exe"
con=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=con)
rdd1=sc.parallelize([1,2,3,4,5])
#过滤选取偶数
rdd2=rdd1.filter(lambda num:num%2==0)
print(rdd2.collect())
sc.stop()
from pyspark import SparkConf,SparkContext
import os
os.environ["PYSPARK_PYTHON"]="E:\Python_setup\python3.10\python.exe"
con=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=con)
rdd1=sc.parallelize([1,2,2,3,4,4,5])
rdd2=rdd1.distinct()
print(rdd2.collect())
sc.stop()
from pyspark import SparkConf,SparkContext
import os
os.environ["PYSPARK_PYTHON"]="E:\Python_setup\python3.10\python.exe"
con=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=con)
#01读文件
rdd1=sc.textFile("E:\pythonProject/hello.txt")
# print(rdd1.collect())
#02取出每个单词,存入单个列表,而不是嵌套列表
word_rdd2=rdd1.flatMap(lambda x:x.split(" "))
# print(word_rdd2.collect())
#03将列表中单词转换成 双元元组('itheima',1), 'itheima',1), ('itcast', 1),以便使用reduceBykey进行数量统计
tulpe_word_rdd3=word_rdd2.map(lambda word:(word,1))
# print(tulpe_word_rdd3.collect())
#04统计数量
num_rdd4=tulpe_word_rdd3.reduceByKey(lambda a,b:a+b)
# print(num_rdd4.collect())
#05对结果进行排序
result_rdd5=num_rdd4.sortBy(lambda x:x[1],ascending=False,numPartitions=1)#ascending=False表示降序排序
print(result_rdd5.collect())
sc.stop()
from pyspark import SparkConf,SparkContext
import os
os.environ["PYSPARK_PYTHON"]="E:\Python_setup\python3.10\python.exe"
con=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=con)
rdd1=sc.parallelize([1,2,3,4,5,6])
#collect()算子
rdd2=rdd1.collect()
print(rdd2)
#take()算子
rdd3=rdd1.take(4)
print(rdd3)
#reduce()算子
rdd4=rdd1.reduce(lambda a,b:a+b)
print(rdd4)
#count()算子
rdd5=rdd1.count()
print(rdd5)
from pyspark import SparkConf,SparkContext
import os
os.environ["PYSPARK_PYTHON"]="E:\Python_setup\python3.10\python.exe"
con=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=con)
#01输出为python对象
# rdd1=sc.parallelize([1,2,3,4,5,6])
# #collect()算子
# rdd2=rdd1.collect()
# print(rdd2)
# #take()算子
# rdd3=rdd1.take(4)
# print(rdd3)
# #reduce()算子
# rdd4=rdd1.reduce(lambda a,b:a+b)
# print(rdd4)
# #count()算子
# rdd5=rdd1.count()
# print(rdd5)
#02输出到本地文本文件
#创建rdd对象
rdd1=sc.parallelize([1,2,3,4,5])
rdd2=sc.parallelize([("hello",3),("spark",5),("Hi",7)])#创建双元祖
rdd3=sc.parallelize([[1,3,5],[6,7,9],[11,13,15]])
#输出到文本文件
rdd1.saveAsTextFile("E:\pythonProject/spark_output1")
rdd2.saveAsTextFile("E:\pythonProject/spark_output2")
rdd3.saveAsTextFile("E:\pythonProject/spark_output3")
直接运行会出错,需要配置Hadoop依赖:
os.environ["HADOOP_HOME"]="E:\Python_setup\spark输出到文件,Hadoop依赖配置\hadoop-3.0.0"
from pyspark import SparkConf,SparkContext
import os
os.environ["PYSPARK_PYTHON"]="E:\Python_setup\python3.10\python.exe"
os.environ["HADOOP_HOME"]="E:\Python_setup\spark输出到文件,Hadoop依赖配置\hadoop-3.0.0"
con=SparkConf().setMaster("local[*]").setAppName("test_spark")
sc=SparkContext(conf=con)
#01输出为python对象
# rdd1=sc.parallelize([1,2,3,4,5,6])
# #collect()算子
# rdd2=rdd1.collect()
# print(rdd2)
# #take()算子
# rdd3=rdd1.take(4)
# print(rdd3)
# #reduce()算子
# rdd4=rdd1.reduce(lambda a,b:a+b)
# print(rdd4)
# #count()算子
# rdd5=rdd1.count()
# print(rdd5)
#02输出到本地文本文件
#创建rdd对象
rdd1=sc.parallelize([1,2,3,4,5])
rdd2=sc.parallelize([("hello",3),("spark",5),("Hi",7)])#创建双元祖
rdd3=sc.parallelize([[1,3,5],[6,7,9],[11,13,15]])
#输出到文本文件
rdd1.saveAsTextFile("E:\pythonProject/spark_output1")
rdd2.saveAsTextFile("E:\pythonProject/spark_output2")
rdd3.saveAsTextFile("E:\pythonProject/spark_output3")
rdd1=sc.parallelize([1,2,3,4,5],numSlices=1)
rdd2=sc.parallelize([("hello",3),("spark",5),("Hi",7)],numSlices=1)#创建双元祖
rdd3=sc.parallelize([[1,3,5],[6,7,9],[11,13,15]],numSlices=1)