PySpark基础入门(8):Spark SQL(内容补充)

news2024/11/16 23:51:47

目录

SparkSQL Shuffle 分区数目

SparkSQL 数据清洗API

dropDuplicates

dropna

fillna

SparkSQL函数定义(UDF函数)

SparkSQL 使用窗口函数

SparkSQL运行流程

SparkSQL的自动优化

Catalyst优化器

SparkSQL Shuffle 分区数目

在SparkSQL中,当Job产生Shuffle的时候,默认的分区数(spark.sql.shuffle.partitions)为200;

在实际的项目中应进行合理的配置:

①在spark-defaults.conf 中设置;

②客户端提交的时候设置:--conf "spark.sql.shuffle.partitions=100"

③在创建sparksession的时候设置:

    spark = SparkSession.builder.\
        appName("test").\
        master("local[*]").\
        config("spark.sql.shuffle.partitions","100").\
        getOrCreate()

在集群中,可以根据集群的cpu核心数设定(可以设置为总核心数的2/4/8...等,也受到其他因素的影响);在本地模式下分区数200会带来很大压力,一般设置为2/4/8/10个

SparkSQL 数据清洗API

dropDuplicates

功能:数据去重

语法:

# 无参数时整体去重
df.dropDuplicates().show()
# 有参数时根据列值进行去重
df.dropDuplicates(['age', 'job']).show()

dropna

功能:删除有缺失值的数据

语法:

# 无参数使用,只有有列值为null,就进行删除
df.dropna().show()
# thresh=3表示至少满足三个有效列
df.dropna(thresh=3).show()
# 在subset规定的列中,至少要有2个有效列,否则删除
df.dropna(thresh=2, subset=['name', 'age']).show()

fillna

功能:填充缺失值

语法:

# 将所有的空值按照给定的值进行填充
df.fillna("loss").show()
# 指定列进行填充
df.fillna("N/A", subset=['job']).show()
# 设定一个字典, 对所有的列 提供填充规则
df.fillna({"name": "未知姓名", "age": 1, "job": "worker"}).show()

SparkSQL函数定义(UDF函数)

目前SparkSQL只支持UDF和UDAF,而pyspark只支持UDF

sparksession.udf.register(参数1,参数2,参数3)

参数1:UDF名称,可用于SQL风格

参数2:被注册成UDF的方法名

参数3:声明UDF的返回值类型

返回值是一个udf对象,可用于DSL风格

示例:

# UDF
def num_ride_10(num):
    return num * 10
udf2 = spark.udf.register("udf1", num_ride_10, IntegerType())
# 在SQL风格中使用:
df.selectExpr("udf1(num)").show() # selectExpr方法可以接受SQL语句表达式

# 在DSL风格中使用
df.select(udf2(df['num'])).show()

②使用pyspark.sql.functionspyspark.sql.functions.udf(参数1,参数2)

参数1:被注册成UDF的方法名

参数2:声明UDF的返回值类型

返回值:是一个UDF对象,可用于DSL风格

示例:

from pyspark.sql import functions as F

udf3 = F.udf(num_ride_10, IntegerType())
df.select(udf3(df['num'])).show()

spark在注册UDF的时候需要注意:返回值需要有合适的类型来声明:

SparkSQL 使用窗口函数

SparkSQL运行流程

SparkSQL的自动优化

为什么SparkSQL可以自动优化而RDD不可以?

因为DataFrame是二维表结构,结构固定,而RDD中可以存储多种不同类型结构的数据

Catalyst优化器

使用优化器的执行架构:

  1. spark通过API接受SQL语句
  2. 将SQL语句交给Catalyst优化器,优化器负责解析SQL,生成执行计划
  3. 优化器的输出是RDD的执行计划
  4. 最终交由集群执行

具体流程:

1、解析SQL,生成抽象语法树(AST)

此时还未进行优化

2、在AST中添加元数据信息

元数据的含义: 

3、对已经加入元数据的AST输入到优化器中开始优化

①断言下推,例如先filter在join: 

这样可以减少join的数据量

②列值裁剪:在断言下推之后进行列值裁剪,将用不到的列裁剪掉,减少处理的数据量

SQL的一般执行顺序:

FROM

WHERE

GROUP BY

HAVING

SELECT

ORDER BY

LIMIT

可以看到,select执行起来是比较靠后的,因此可以通过列值裁剪,减少之前的步骤的数据量

4、经过优化生成了逻辑计划,根据逻辑计划生成物理计划,从而生成RDD来运行

在生成物理计划的时候,会根据”成本模型“对整棵树再次进行优化,选择一个更好的计划

可以通过queryExecution来查看逻辑计划,通过explain来查看物理计划

示例:

if __name__ == '__main__':
    spark = SparkSession.builder.\
        appName("test").\
        config("spark.sql.shuffle.partitions", 100).\
        getOrCreate()
    sc = spark.sparkContext
    rdd = sc.textFile("hdfs://10.245.150.47:8020/user/wuhaoyi/input/sql/people.txt").\
        map(lambda x: x.split(",")).\
        map(lambda x: (x[0], int(x[1])))
    df = spark.createDataFrame(rdd, schema=['name', 'age'])
    df.createOrReplaceTempView("people")
    spark.sql("SELECT * FROM people WHERE age < 30").explain()
    

如图:

通过explain(True)可以查看更多执行计划:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/506787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无魔法插件 - ChatGPT Sidebar with GPT-4

文章目录 1.介绍2.功能一览2.1 唤醒方式2.2 聊天功能2.3 快捷模板2.4 单独聊天界面2.5 ChatPDF2.6 任意位置快捷使用模板2.7 手机 APP 3.GPT-3.0 还是 GPT-3.5&#xff1f;4.免费 or 收费&#xff1f;5.安装 Sidebar 创作不易&#xff0c;如果本文对你有帮助&#xff0c;胖友记…

SpringCloud(22):Sentinel对Feign的支持

Sentinel 适配了 Feign组件。如果想使用&#xff0c;除了引入 spring-cloud-starter-alibaba-sentinel 的依赖外还需要 2个步骤&#xff1a; 配置文件打开 Sentinel 对 Feign 的支持&#xff1a;feign.sentinel.enabledtrue加入 spring-cloud-starter-openfeign 依赖使 Sentin…

springboot 整合redis

第一步&#xff1a;pom.xml文件导入坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.5.4</version> </dependency 第二步&#xff1a;appli…

【iOS】—— NSProxy类

NSProxy 文章目录 NSProxyNSProxy简介NSProxy模拟多继承NSProxy 避免NSTimer循环引用 在学消息转发的时候看到过这个类&#xff0c;本来没打算细看&#xff0c;后来看学长博客循环引用的时候也看到了这个类&#xff0c;就来细看看。 NSProxy简介 NSProxy 是一个实现了 NSObjec…

在线病毒分析工具评测试用

总览 1 区分在线杀毒引擎与在线沙盒 在线杀毒引擎用的大多是国际上出名的杀毒厂商的引擎作为底层&#xff0c;对文件进行扫描&#xff0c;结论通常会反馈“无毒”或者杀毒引擎自己的代码。 在线沙盒用云端的机器跑一次程序&#xff0c;然后收集程序的相关信息。 两者各有与…

情感分析讲解

情感分析简述 情感分析(Sentiment Analysis)又称倾向性分析&#xff0c;或意见挖掘&#xff0c;它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。利用情感分析能力&#xff0c;可以针对带有主观描述的自然语言文本&#xff0c;自动判断该文本的情感正负倾向…

MongoDB 聚合操作Map-Reduce

这此之前已经对MongoDB中的一些聚合操作进行了详细的介绍&#xff0c;主要介绍了聚合方法和聚合管道&#xff1b;如果您想对聚合方法和聚合管道进行了解&#xff0c;可以参考&#xff1a; MongoDB 数据库操作汇总https://blog.csdn.net/m1729339749/article/details/130086022…

ClickHouse为何能超越Elasticsearch?

背景 Elasticsearch是一个强大的分布式全文检索和数据分析引擎&#xff0c;也是日志分析系统经常使用的一种实现方案&#xff0c;但近年来随着ClickHouse的发展&#xff0c;Elasticsearch在日志分析领域的地位逐渐被取代&#xff0c;许多公司已经将自己的日志分析解决方案从ES…

games101作业1

作业1的大致要求就是让我们实现如下两个函数&#xff0c;一个是返回在三维空间中绕着Z轴旋转的矩阵&#xff0c;另一个是返回投影矩阵。正确完成这两个函数之后&#xff0c;运行代码你就会在窗口中看到一个三角形&#xff0c;并且按a键和d键会发生旋转。 首先来实现get_model_m…

RuleApp1.4.0 文章社区客户端

简介&#xff1a; 可以打包成安卓&#xff0c;苹果&#xff0c;h5&#xff0c;小程序&#xff0c;全新的版本增加了私聊和群聊&#xff0c;动态模块等&#xff0c;还有自动和手动封禁机制。[滑稽][滑稽]主要模块&#xff1a;用户模块&#xff0c;文章模块&#xff0c;动态模块…

国产服务器tomcat开机自启

目录结构 前言方法一方法二方法三参考连接 前言 国产服务器配置tomcat开机自启动&#xff1b;目前测试两种服务器 银河麒麟&#xff08;Linux localhost.localdomain 4.19.90-52.22.v2207.ky10.x86_64 #1 SMP Tue Mar 14 12:19:10 CST 2023 x86_64 x86_64 x86_64 GNU/Linux&am…

多模态速读:ViLT、ALBEF、VLMO、BLIP

ViLT : Vision-and-Language Transformer Without Convolution or Region Supervision ViLT : Vision-and-Language Transformer Without Convolution or Region SupervisionIntroductionApproach参考 ALBEF: Vision and LanguageRepresentation Learning with Momentum Distil…

如何在香港服务器上进行网站迁移?五个主要步骤

​  服务器迁移是将大量关键信息从一台服务器移动到另一台服务器的过程&#xff0c;同时确保新服务器已正确配置以承载这些新信息。对于业务涉及中国大陆、香港及亚太区地区往来的用户&#xff0c;您可能需要将网站迁移到香港服务器上&#xff0c;来更好地发展业务。香港服务…

【c语言】字符串常用函数组件化封装 | 字符串总结

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

【JavaScript】9.事件

事件 1. 注册事件&#xff08;绑定事件&#xff09; 给元素添加事件&#xff0c;称为注册事件或者绑定事件 1.1 注册事件两种方式 传统注册方式&#xff08;onclick&#xff09; 传统方式注册事件特点&#xff1a; 注册事件的唯一性同一个元素同一个事件只能设置一个处理函数…

离了大谱,公司测试岗却新来了个00后卷王,3个月薪资干到20K.....

最近聊到软件测试的行业内卷&#xff0c;越来越多的转行和大学生进入测试行业。想要获得更好的待遇和机会&#xff0c;不断提升自己的技能栈成了测试老人迫在眉睫的问题。 不论是面试哪个级别的测试工程师&#xff0c;面试官都会问一句“会编程吗&#xff1f;有没有自动化测试…

spring-web HandlerAdapter 源码分析

说明 本文基于 jdk 8, spring-framework 5.2.x 编写。author JellyfishMIX - github / blog.jellyfishmix.comLICENSE GPL-2.0 HandlerAdapter 接口 提供作为处理器适配器的能力。 supports 方法判断是否支持该 handler。 public interface HandlerAdapter {/*** 判断是否…

【跟着陈七一起学C语言】今天总结:初识C语言

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

Ansys Zemax | 设计抬头显示器时要使用哪些工具 – 第二部分

本文为使用OpticStudio工具设计优化HUD抬头显示器系统的第二部分&#xff0c;主要包含演示了如何使用OpticStudio工具设计分析抬头显示器&#xff08;HUD&#xff09;性能&#xff0c;即全视场像差&#xff08;FFA&#xff09;和NSC矢高图。&#xff08;联系我们获取文章附件&a…

RabbitMQ之工作队列 ( Work Queues )

Work Queues 1. 轮询分发消息1.1 抽取工具类1.2 启动两个工作线程1.3 启动一个发送线程1.4 结果展示 2. 消息应答2.1 概念2.2 自动应答2.3 消息应答的方法2.4 Multiple 的解释2.5 消息自动重新入队2.6 消息手动应答代码2.7 手动应答效果演示 3. RabbitMQ 持久化3.1 概念3.2 队列…