SparkSql的学习

一、SparkSql概述

SparkSql是Spark的一个模块,用于处理海量结构化数据(注意是只能处理结构化数据)。

1.1 SparkSql和Hive的异同

1.2 SparkSql的数据抽象

1.3 SparkSession对象

SparkSession对象可以用于SparkSql编程作为入口对象,也可以用于SparkCore编程,可以通过SparkSession对象中获取到SparkContext。

1.4 SparkSession的构建

构建SparkSession的核心代码:

from pyspark.sql import SparkSession
if __name__ == '__main__':
# 构建SparkSql执行环境入口对象
sparksession = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
# 通过SparkSession对象获取SparkContext对象
sc = sparksession.sparkContext

二、DataFrame

2.1 DataFrame的组成

DataFrame是一个二维表结构,在结构层面,StructType对象描述整个DataFrame的表结构,StructField对象描述一个列的信息。在数据层面,Row对象记录一行数据,Column对象记录一列数据并包含列的信息。

2.2 DataFrame的构建方法

2.2.1 基于rdd和pandas库的构建方法

1.将RDD转换为DataFrame;
2.通过SparkType对象定义DataFrame的表结构将rdd转换成dataFrame对象;
3.使用rdd的toDF方法转换rdd;
4.将pandas库的DataFrame构建为Sparksql的DataFrame;

from pyspark.sql import SparkSession
from pyspark.sql.types import StructType,StringType,IntegerType
import pandas as pd
if __name__ == '__main__':
# 构建SparkSql执行环境入口对象
sparksession = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
# 通过SparkSession对象获取SparkContext对象
sc = sparksession.sparkContext
rdd = sc.wholeTextFiles("/opt/sofetware/word.txt", 4)
# 方法一
# 构建DataFrame对象,参数1,要转换的rdd对象,参数2,指定列名
# df = sparksession.createDataFrame(rdd,schema=['name','age'])
# 方法二
# 构建表结构的描述对象StructType
# schema = StructType.add("name",StringType(),nullable=True).add("age",IntegerType,nullable=False)
# 基于structType对象构建rdd到DF的转换
# df = sparksession.createDataFrame(rdd,schema=schema)
# 方法三
# 使用rdd的toDF方法将rdd转换成DataFrame
# df = rdd.toDF(["name","age"])
# 还可以使用toDF的另一种用法
# schema = StructType.add("name", StringType(), nullable=True).add("age", IntegerType, nullable=False)
# df = rdd.toDF(schema=schema)
# 方法四
# 基于pandas的DataFrame构建SparkSql的DataFrame对象
pdf = pd.DataFrame(
{
"id":[1,2,3],
"name":["hh","jj","ii"]
}
)
df = sparksession.createDataFrame(pdf)
# 打印dataframe的表结构
df.printSchema()
# 参数一表示展示的数据条数,不设置的话默认是20条,
# 参数2表示是否对列进行截断,详情自己搜吧
df.show(20,False)

2.2.2 读取外部数据构建DataFrame

1.读取text文件;
2.读取json文件;
3.读取csv文件;
4.读取parquet文件(Spark中常用的列式存储文件);

from pyspark.sql import SparkSession
from pyspark.sql.types import StructType,StringType,IntegerType
if __name__ == '__main__':
# 构建SparkSql执行环境入口对象
sparksession = SparkSession.builder.appName("test").master("local[*]").getOrCreate()
# 通过SparkSession对象获取SparkContext对象
sc = sparksession.sparkContext
# 1.读取text类型数据
# 构建StructType,读取text数据的特点是,将一行当作是一整个的数据,所以读取下来的数据只有一列,默认列名是value,类型是string
# 参数1 是指定的列名,参数2 是类型,参数2 是否允许为空
# schema = StructType.add("data",StringType(),nullable=True)
# df = sparksession.read.format("text").schema(schema=schema).load("/opt/sofetware/word.txt")
# 2.读取json类型数据
# 由于json类型数据自带schema,所以不用构建schema
# df = sparksession.read.format("json").load("/opt/sofetware/word.json")
# 3.读取csv类型数据
# 从第一个option开始分别是: 设置列分隔符,文件是否有表头,编码,指定列名和类型,指定文件路径
# df = sparksession.read.format("csv")\
# .option("sep",";")\
# .option("header",True)\
# .option("encoding","utf-8")\
# .schema("name STRING,age,INT,job STRING")\
# .load("/opt/sofetware/word.csv")
# 4.读取parquet类型数据
# parquet文件自带schema,不需要构建了
df = sparksession.read.format("parquet").load("/opt/sofetware/word.parquet")
df.printSchema()
df.show()

2.3 DataFrame的两种编程风格

1.DSL风格:就是调用DataFrame的API的方式来处理数据;
常用的API有:df.show(),df.printSchema(),df.select(),df.filter(),df.where(),df.groupBy()
其中需要注意的是:除groupBy()API返回的是GroupedData数据,其它API返回的都是DataFrame数据。GroupedData对象是一个特殊的DataFrame数据集,它也有很多API,如:min(),max(),avg(),sum(),count()等,GroupedData数据经过sum聚合后仍是DataFrame对象。

2.Sql风格:就是用sql语句处理数据(好像那个废话。。)
这种风格首先需要采用以下的方式将DataFrame注册成表:
全局表可以跨SparkSession对象使用,在一个程序内的多个SparkSession中均可调用(调用前需要加上前缀global_temp);
临时表只在当前SparkSession对象中可用。

# 注册一个临时视图
df.creatTempView("score")
# 注册一个临时表,如果存在进行替换
df.creatOrReplaceTempView("score")
# 注册一个全局表
df.creatGlobalTempView("score")

注册好表后可以使用sparksession.sql("sql语句")来执行查询,返回值是一个新的df。

# 将DF对象转换成临时视图表可供sql语句查询
df.createOrReplaceTempView("people")
sparksession.sql("SELECT * FROM people WHERE age < 30").show()

3.同时pyspark还为SaprkSql提供了一个pyspark.sql.functions计算包,使用方法为:from pyspark.sql.functions import functions as F。这些功能对象,返回值多是Column对象。
补充拓展API:

2.4 SparkSql数据清洗API

1.对数据进行去重:df.dropDuplicates()(两种使用方法,有参和无参);
2.删除存在缺失值的行:df.dropna()(存在有参和无参两种方法);
3.填充缺失值数据:df.fillna("填充的内容")(可以指定列名);

2.5 DataFrame数据写出

统一API语法:

2.6 DataFrame也可以连接数据库进行读写

(这里不做过多展示,自己查吧)

三、SparkSql函数定义

3.1 定义UDF函数

定义方式有两种:
1.sparksession.utf.register()
注册的函数只可以用于sql风格,返回的UTF对象可以用于DSL风格(有点绕,哈哈,emmm有点懂了,反正是这两种风格都可以使用的,只不过可能得变一下);
2.pyspark.sql.functions.udf()
仅能用于DSL风格

3.2 窗口函数

开窗函数即在每一行的最后一列添加聚合函数的结果,聚合函数是将多行变成一行,开窗函数是把一行变成多行。
用自己的话讲就是在sql语句中用over这个关键词,可以给整个表加上一列,比如总数啊,或者排名之类的。

开窗函数的分类:
1.聚合开窗函数;
2.排序开窗函数;
3.分区类型的窗口函数;

四、SparkSql的运行流程

4.1 SparkSql的自动优化

sparkSql会对写好的代码进行自动优化,以提升代码运行效率,避免开发者水平影响到代码执行效率,sparkSql使用的内置优化器是Catalyst.

4.2 Catalyst执行的流程

1.首先解析sql,并且生成AST(抽象语法数);
2.在AST中加入元数据信息,主要为了做一些优化;
3.对加入元数据的AST输入优化器,进行优化,最主要的优化方法有:断言下推(行过滤,即将逻辑判断提前,以减少shuffle阶段的数据量)和列值裁剪(列过滤,即将加载的列进行裁剪,尽量减少被处理数据的宽度);
4.这个时候生成的AST叫做逻辑计划,是不能够直接运行的,需要生成物理计划,从而生成rdd来运行;

4.3 SparkSql的执行流程

五、Spark On Hive

Spark On Hive 就是将hive的metastore服务给Spark做元数据管理功能。

emmm目前还没学hive,等我装上hive再回来补充哈 视频地址 或者你自己搜网上的也行

六、分布式sql执行引擎


还需要在上一章节的基础上搭建配置,所以跳过了就,等学完hive再搞这个,而且我现在听也没听懂哈哈

posted @   KongLong_cm  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示