文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SQL、Pandas和Spark:常用数据查询操作对比

2024-12-03 06:56

关注

[[392217]]

01 SQL标准查询

谈到数据,必会提及数据库;而提及数据库,则一般指代关系型数据库(RMDB),操作关系型数据库的语言则是SQL(Structured Query Language)。SQL本质上仍然属于一种编程语言,并且有着相当悠久的历史,不过其语法特性却几乎没怎么变更过,从某种意义上讲这也体现了SQL语言的过人之处。

 

 

 

 

在最新TIOBE排行榜中,SQL位居第10位

一般而言,一句标准的SQL语句按照书写顺序通常含有如下关键词:

这是一条SQL查询语句中所能涉及的主要关键字,经过解析器和优化器之后,最后的执行过程则又与之差别很大,执行顺序如下:

曾经,个人一度好奇为何不将SQL语句的书写顺序调整为与执行顺序一致,那样更易于理解其中的一些技术原理,但查询资料未果后,就放弃了……

当然,本文的目的不是介绍SQL查询的执行原理或者优化技巧,而仅仅是对标SQL查询的几个关键字,重点讲解在Pandas和Spark中的实现。

02 Pandas和Spark实现SQL对应操作

以下按照SQL执行顺序讲解SQL各关键字在Pandas和Spark中的实现,其中Pandas是Python中的数据分析工具包,而Spark作为集Java、Scala、Python和R四种语言的通用分布式计算框架,本文默认以Scala语言进行讲述。

1)from。由于Python和Scala均为面向对象设计语言,所以Pandas和Spark中无需from,执行df.xxx操作的过程本身就蕴含着from的含义。

2)join on。join on在SQL多表查询中是很重要的一类操作,常用的连接方式有inner join、left join、right join、outer join以及cross join五种,在Pandas和Spark中也都有相应关键字。

Pandas:Pandas实现join操作有两个主要的API:merge和join。其中merge是Pandas的顶层接口(即可直接调用pd.merge方法),也是DataFrame的API,支持丰富的参数设置,主要介绍如下:

 

  1. def merge( 
  2.     left,  # 左表 
  3.     right,  # 右表 
  4.     how: str = "inner",  # 默认连接方式:inner 
  5.     on=None,  # SQL中on连接一段,要求左表和右表中 公共字段 
  6.     left_on=None,  # 设置左表连接字段 
  7.     right_on=None,  # 设置右表连接字段 
  8.     left_index: bool = False,  # 利用左表索引作为连接字段 
  9.     right_index: bool = False,  # 利用右表索引作为连接字段 
  10.     sort: bool = False,  # join结果排序 
  11.     suffixes=("_x""_y"),  # 非连接字段有重名时,可s何止后缀 
  12.     copy: bool = True,  
  13.     indicator: bool = False
  14.     validate=None, 
  15. ) -> "DataFrame"

上述参数中,可以设置on连接条件的方式主要有3种:即若连接字段为两表共有字段,则可直接用on设置;否则可分别通过left_on和right_on设置;当一个表的连接字段是索引时,可设置left_index为True。

与merge操作类似,join可看做是merge的一个简化版本,默认以索引作为连接字段,且仅可通过DataFrame来调用,不是Pandas的顶级接口(即不存在pd.join方法)。

另外,concat也可通过设置axis=1参数实现横向两表的横向拼接,但更常用于纵向的union操作。

Spark:相较于Pandas中有多种实现两个DataFrame连接的方式,Spark中接口则要单一许多,仅有join一个关键字,但也实现了多种重载方法,主要有如下3种用法:

 

  1. // 1、两个DataFrame有公共字段,且连接条件只有1个,直接传入连接列名 
  2. df1.join(df2, "col"
  3. // 2、有多个字段,可通过Seq传入多个字段 
  4. df1.join(df2, Seq("col1""col2"
  5. // 3、两个DataFrame中连接字段不同名,此时需传入判断连接条件 
  6. df1.join(df2, df1("col1")===df2("col2")) 
  7. // 注意,上述连接条件中,等于用===,不等于用=!= 

3)where。数据过滤在所有数据处理流程中都是重要的一环,在SQL中用关键字where实现,在Pandas和Spark中也有相应的接口。

Pandas。Pandas中实现数据过滤的方法有多种,个人常用的主要是如下3类:

Spark。Spark中实现数据过滤的接口更为单一,有where和filter两个关键字,且二者的底层实现是一致的,所以实际上就只有一种用法。但在具体使用中,where也支持两种语法形式,一种是以字符串形式传入一个类SQL的条件表达式,类似于Pandas中query;另一种是显示的以各列对象执行逻辑判断,得到一组布尔结果,类似于Pandas中loc操作。

4)group by。group by关键字用于分组聚合,实际上包括了分组和聚合两个阶段,由于这一操作属于比较规范化的操作,所以Pandas和Spark中也都提供了同名关键字,不同的是group by之后所接的操作算子不尽相同。

Pandas:Pandas中groupby操作,后面可接多个关键字,常用的其实包括如下4类:

Spark:Spark中的groupBy操作,常用的包括如下3类:

5)having。在SQL中,having用于实现对聚合统计后的结果进行过滤筛选,与where的核心区别在于过滤所用的条件是聚合前字段还是聚合后字段。而这在Pandas和Spark中并不存在这一区别,所以与where实现一致。

6)select。选择特定查询结果,详见Pandas vs Spark:获取指定列的N种方式。

7)distinct。distinct在SQL中用于对查询结果去重,在Pandas和Spark中,实现这一操作的函数均为drop_duplicates/dropDuplicates。

8)order by。order by用于根据指定字段排序,在Pandas和Spark中的实现分别如下:

Pandas:sort_index和sort_values,其中前者根据索引排序,后者根据传入的列名字段排序,可通过传入ascending参数控制是升序还是降序。

Spark:orderBy和sort,二者也是相同的底层实现,功能完全一致。也是通过传入的字段进行排序,可分别配合asc和desc两个函数实现升序和降序。

 

  1. // 1、指定列+desc 
  2. df.orderBy(df("col").desc
  3. // 2、desc函数加指定列 
  4. df.orderBy(desc("col")) 

9)limit。limit关键字用于限制返回结果条数,这是一个功能相对单一的操作,二者的实现分别如下:

Pandas:可分别通过head关键字和iloc访问符来提取指定条数的结果;

Spark:直接内置了limit算子,用法更接近SQL中的limit关键字。

10)Union。SQL中还有另一个常用查询关键字Union,在Pandas和Spark中也有相应实现:

Pandas:concat和append,其中concat是Pandas 中顶层方法,可用于两个DataFrame纵向拼接,要求列名对齐,而append则相当于一个精简的concat实现,与Python中列表的append方法类似,用于在一个DataFrame尾部追加另一个DataFrame;

Spark:Spark中直接模仿SQL语法,分别提供了union和unionAll两个算子实现两个DataFrame的纵向拼接,且含义与SQL中完全类似。

03 小节

对标SQL标准查询语句中的常用关键字,重点对Pandas和Spark中相应操作进行了介绍,总体来看,两个计算框架均可实现SQL中的所有操作,但Pandas实现的接口更为丰富,传参更为灵活;而Spark则接口更为统一,但一般也支持多种形式的方法重载。另外,Spark中的算子命名与SQL更为贴近,语法习惯也与其极为相似,这对于具有扎实SQL基础的人快速学习Spark来说会更加容易。

来源:小数志内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯