PySpark入门

PySpark入门

  • Apache Spark是用于大规模数据处理的统一分析引擎;简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据
  • PySpark是由Spark官方开发的Python第三方库

基础准备

  • 下载包
    • cmd:pip install pyspark

* 配置pip全局镜像源:cmd:pip config --global set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple


构建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()

PySpark流程:数据输入->数据处理计算->数据输出


数据输入

RDD对象

  • PySpark支持多种数据的输入,在输入完成后,都会得到一个RDD类的对象
  • RDD全称:弹性分布式数据集(Resilient Distributed Datasets)
  • PySpark针对数据的处理,都是以RDD对象作为载体,即:
    • 数据存储在RDD内
    • 各类数据的计算方法,也是RDD的成员方法
    • RDD的数据计算方法,返回值依旧是RDD对象
# PySpark支持通过SparkContext对象的parallelize成员方法,将list/tuple/set/dict/str转换为PySpark的RDD对象
rdd = sc.parallelize(数据容器对象)

# PySpark也支持通过SparkContext入口对象来读取文件,构建出RDD对象
rdd = sc.textFile(文件路径)

# 输出RDD的内容
print(rdd.collect())

数据计算

  • RDD对象内置丰富的成员方法(算子)

* PySpark找不到Python解释器报错

import os
os.environ['PYSPARK_PYTHON'] = '电脑中PYTHON.EXE地址'

map算子

  • map算子是将RDD的数据一条条处理(处理的逻辑:基于map算子中接收的处理函数),返回新的RDD
# 例

# 准备一个RDD
rdd = sc.parallelize([1,2,3,4,5])
# 通过map方法将全部数据都乘以10
rdd2 = rdd.map(lambda a:a*10)
print(rdd2.collect())

flatMap算子

  • 对rdd执行map操作,然后进行解除嵌套操作
# 解除嵌套例

# 嵌套
list=[[1,2,3],[4,5,6],[7,8,9]]
# 解除嵌套
list=[1,2,3,4,5,6,7,8,9]
# 例

# 准备一个RDD
rdd = sc.parallelize(["itheima itcast 666","itheima itheima itcast","python itheima"])
# flatMap方法&与map方法对比
rdd2 = rdd.map(lambda x:x.split(" "))
rdd3 = rdd.flatMap(lambda x:x.split(" "))
print(rdd2.collect())
print(rdd3.collect())

reduceByKey算子

  • 针对KV型RDD,自动按照key分组,然后根据提供的聚合逻辑,完成组内数据(value)的聚合操作
  • reductByKey中接收的函数只负责聚合,不理会分组;分组是自动by key分组的
# 例:先按照a、b分组,再进行聚合运算
rdd = sc.parallelize([('a',2),('a',3),('b',4),('b',5),('a',6),('b',7),('b',8)])
rdd = rdd.reduceByKey(lambda a,b:a+b)
print(rdd.collect())
# 结果:[('b', 24), ('a', 11)]

filter算子

  • 过滤想要的数据进行保留
# 保留偶数
rdd = sc.parallelize([1,2,3,4,5])
rdd = rdd.filter(lambda x:x%2==0)
print(rdd.collect())

distinct算子

  • 对RDD数据进行去重,返回新RDD
  • 新对象无序
# 例
rdd = sc.parallelize([1,2,2,3,3,4,5,6,6,7])
rdd = rdd.distinct()
print(rdd.collect())

sortBy算子

  • 对RDD数据进行排序,基于你指定的排序依据
# 例
rdd = sc.parallelize([[1,2,3],[1,4,3],[1,3,3]])
# func表示按照哪个数据进行排序,ascending为False表示从大到小,numPartitions表示用多少分区排序
rdd = rdd.sortBy(lambda x:x[1],ascending=False,numPartitions=1)
print(rdd.collect())

数据输出

输出为PYTHON对象

collect算子

  • 将RDD各个分区内的数据,统一收集到Driver中,形成一个list对象
rdd.collect()

reduce算子

  • 对RDD数据集按照传入的逻辑进行聚合,返回PYTHON数据类型
rdd = sc.parallelize([1,2,3,4,5])
a = rdd.reduce(lambda a,b:a+b)
print(a)
print(type(a))
# 结果:15 类型:INT

take算子

  • 取RDD的前N哥元素,组合成list返回
rdd = sc.parallelize([3,5,9,1,2,4,3])
a = rdd.take(5)
print(a)
# 结果:[3, 5, 9, 1, 2]

count算子

  • 计算RDD内有多少条数据
rdd = sc.parallelize([3,5,9,1,2,4,3])
a = rdd.count()
print(a)
print(type(a))
# 结果:7 类型:INT

输出到文件中

savaAsTextFile算子

  • 将RDD的数据写入到文本文件中
  • 支持本地写出,hdfs等文件系统
rdd = sc.parallelize([[3,5,9,1,2,4,3]])
rdd.saveAsTextFile("E:/1")
# 产生文件数取决于有几个分区;分区默认取决于CPU核心数,部分分区文件可能不含数据
# ------------------------------------------------------------------------------
# 设置分区
# 方法一 SparkConf对象设置属性全局并行度为1:
conf.set("spark.default.parallelism","1") #SPARK默认并行度
# 方法二 创建RDD的时候设置
rdd = sc.parallelize([1,2,3,4,5],numSlices=1)
rdd = sc.parallelize([1,2,3,4,5],1)
  • 依赖HADOOP框架,需要配置依赖:

    1. 下载HADOOP安装包

    2. 解压

    3. os.environ['HADOOP_HOME']='HADOOP解压文件夹路径'
      
    4. 下载winutils.exe并放入Hadoop解压文件夹的bin目录内

    5. 下载Hadoop.dll并放入:C:/Windows/System32/文件夹中


posted @ 2023-03-07 17:02  Learn1ng  阅读(323)  评论(0)    收藏  举报