pyspark
固定流程
"""
演示pyspark
"""
# 导包
from pyspark import SparkConf, SparkContext
# 创建SparkConf对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf创建SparkContext对象
sc = SparkContext(conf=conf)
#打印PySpark的运行版本
print(sc)
#停止
sc.stop()
数据输入
RDD对象
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,是spark core的底层核心,它代表一个不可变、可分区、里面的元素可并行计算的集合。
数据输入
通过SparkContext对象调用parallelize方法将Python对象加载到Spark内,成为RDD对象
可以添加Python以下类型
-
list
-
tuple
-
set
-
dict
-
str
from pyspark import SparkContext,SparkConf
# 创建SparkConf对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf创建SparkContext对象
sc = SparkContext(conf=conf)
rdd1 = sc.parallelize([1, 2, 3])
rdd2 = sc.parallelize((1, 2, 3))
rdd3 = sc.parallelize("abcd")
rdd4 = sc.parallelize({1, 2, 3})
rdd5 = sc.parallelize({"key1": "value1", "key2": "value2"})
如果要查看RDD里面有什么内容,需要用到collect()方法
from pyspark import SparkContext,SparkConf
# 创建SparkConf对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf创建SparkContext对象
sc = SparkContext(conf=conf)
rdd1 = sc.parallelize([1, 2, 3])
rdd2 = sc.parallelize((1, 2, 3))
rdd3 = sc.parallelize("abcd")
rdd4 = sc.parallelize({1, 2, 3})
rdd5 = sc.parallelize({"key1": "value1", "key2": "value2"})
用textFile方法,读取文件数据加载到Spark内,成为RDD对象
rdd = sc.textFile("D:/hello.txt")
print(rdd.collect)
得到RDD后可以调用RDD方法进行计算
map算子
功能:map算子是将RDD的数据一条条处理,返回新的RDD
from pyspark import SparkContext,SparkConf
#Spark需要
import os
os.environ['PYSPARK_PYTHON'] = "E:/Python/python.exe"
# 创建SparkConf对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf创建SparkContext对象
sc = SparkContext(conf=conf)
rdd = sc.parallelize([1,2,3,4,5])
def func(data):
return data * 10
#方法不用加括号
rdd_map = rdd.map(func)
#也可以匿名内部类
# rdd2 = rdd.map(lambda x : x * 10)
print(rdd_map.collect())
flatMap算子
功能:对rdd执行map操作,然后进行解除嵌套操作
#解除嵌套的list lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] #如果解除嵌套 lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
from pyspark import SparkContext,SparkConf
#Spark需要
import os
os.environ['PYSPARK_PYTHON'] = "E:/Python/python.exe"
# 创建SparkConf对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf创建SparkContext对象
sc = SparkContext(conf=conf)
rdd = sc.parallelize(["itheima itcast 666", "itheima itheima itcast", "python itheima"])
#解除嵌套
flat_map = rdd.flatMap(lambda x : x.split(" "))
print(flat_map.collect())
输出结果:
['itheima', 'itcast', '666', 'itheima', 'itheima', 'itcast', 'python', 'itheima']
reduceBykey算子
功能:针对KV型RDD, 自动按照key分组,然后根据呢提供的聚合逻辑,完成组内数据(value)的聚合操作
需要传入两个参数,返回一个参数,类型需一样
from pyspark import SparkContext,SparkConf
#Spark需要
import os
os.environ['PYSPARK_PYTHON'] = "E:/Python/python.exe"
# 创建SparkConf对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf创建SparkContext对象
sc = SparkContext(conf=conf)
rdd = sc.parallelize([('a', 1), ('a', 1), ('b', 1), ('a', 1), ('b', 1)])
reduce_by_key = rdd.reduceByKey(lambda a, b: a + b)
print(reduce_by_key.collect())
filter算子
功能:过滤想要的数据进行保留
#保留奇数 #满足条件的保留 rdd.filter(lambda x : x % 2 == 1)
distinct算子
功能:对RDD数据进行去重,返回新的RDD
直接调用,不用传入方法
from pyspark import SparkContext,SparkConf
#Spark需要
import os
os.environ['PYSPARK_PYTHON'] = "E:/Python/python.exe"
# 创建SparkConf对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf创建SparkContext对象
sc = SparkContext(conf=conf)
rdd = sc.parallelize([1,1,2,2,3,3,3,4,5,6])
rdd_distinct = rdd.distinct()
print(rdd_distinct)
sortBy算子
功能:对RDD数据进行排序,基于你指定的排序依据
想根据谁排序就返回谁
语法:
ascending 升降序
numPartitions 分区数量
#根据第二个排序
rdd.sortBy(lambda x : x[1], ascending=Flase,numPartitions=1)
数据输出
输出为python对象
collect算子
rdd.collect() #返回值为list
reduce算子
功能:对RDD数据集按照你传入的逻辑进行聚合
语法:
rdd = sc.parallelize([1,2,3,4,5])
#reduce
rdd_reduce = rdd.reduce(lambda a, b: a + b)
print(rdd_reduce)
#输出15
take算子
功能:取出RDD前N个元素,组成list返回
#take
rdd_take = rdd.take(3)
print(rdd_take)
count算子
功能:统计RDD元素个数
#count
rdd_count = rdd.count()
print(rdd_count)
输出到文件中
saveAsTextFile算子
功能:将RDD的数据写入文本文件中
支持 本地输出,hdfs等文件系统