本文首先介绍了SQL查询操作的一般流程,对标了SQL查询语句的关键字,重点介绍了Pandas和Spark,主要包含了10个常用的算子操作。01SQL标准查询说到数据,就不能不说数据库;说到数据库,一般指的是关系型数据库(RMDB),而操作关系型数据库的语言就是SQL(StructuredQueryLanguage)。SQL本质上仍然是一种编程语言,有着悠久的历史,但它的语法特征几乎没有改变。从某种意义上说,这也体现了SQL语言的优秀之处。在最新的TIOBE排行榜中,SQL排名第10一般而言,一条标准的SQL语句通常包含以下关键字,按书写顺序排列:select:指定查询字段distinct:去重查询结果字段from:指定查询的数据库与表joinon:指定查询数据来自多表连接和条件where:设置查询结果过滤条件groupby:设置分组聚合统计的字段having:根据聚合统计后的字段进一步过滤orderby:设置排序返回结果限制的依据:限制返回结果的数量。这是SQL查询语句中可以涉及的主要关键字。经过parser和optimizer之后,最终的执行过程和它有很大的不同。执行顺序如下:from:先找到要查询的表joinon:如果目标数据表不止一张,为多张表建立连接关系where:根据查询条件过滤数据记录groupby:分组和聚合过滤结果有:对分组聚合结果进行二次过滤select:对二次过滤结果提取目标字段distinct:按条件去重处理orderby:对去重结果进行排序limit:只返回排序后指定条数记录一次,很好奇为什么不调整SQL语句的书写顺序,为了和执行顺序一致,这样更容易理解一些技术原理,但是查询数据失败后,我放弃了。。。当然,本文的目的不是介绍SQL查询的执行原理或优化技巧,只是对标SQL查询ries几个关键字,重点介绍在Pandas和Spark中的实现。02Pandas和Spark实现SQL对应操作下面按照SQL执行的先后顺序来讲解Pandas和Spark中SQL关键字的实现。Pandas是Python中的数据分析工具包,Spark是Java、Scala、Python和R语言的通用分布式计算框架,本文默认使用Scala语言。1)从。由于Python和Scala都是面向对象的设计语言,所以在Pandas和Spark中不需要from,执行df.xxx操作的过程本身就包含from的意思。2)加入。Joinon是SQL多表查询中非常重要的一类操作。常用的连接方式有innerjoin、leftjoin、rightjoin、outerjoin、crossjoin,在Pandas和Spark中都有对应的关键字。Pandas:Pandas使用两个主要API实现连接操作:merge和join。其中merge是Pandas的顶层接口(可以直接调用pd.merge方法),也是DataFrame的API,支持丰富的参数设置。主要介绍如下:defmerge(left,#lefttableright,#righttablehow:str="inner",#默认连接方式:neron=None,#SQL中on连接一段,需要公共字段left_on=Noneinthelefttableandrighttable,#设置左表连接字段right_on=None,#设置右表连接字段left_index:bool=False,#使用左表索引作为连接字段right_index:bool=False,#使用右表索引作为连接字段sort:bool=False,#join结果排序suffixes=("_x","_y"),#non当连接字段同名时,可以使用多后缀copy:bool=True,indicator:bool=False,validate=None,)->"DataFrame":上述参数中,设置on连接条件的方式主要有3种:即如果连接字段是普通字段两个表中,直接用on设置即可;否则,可以分别通过left_on和right_on进行设置;当表的连接字段是索引时,left_index可以设置为True。与merge操作类似,join可以看作是merge的简化版。默认使用索引作为连接字段,只能通过DataFrame调用。它不是Pandas的顶级接口(即没有pd.join方法)。另外,concat也可以通过设置axis=1参数实现两个水平表的水平拼接,但更常用于垂直联合操作。Spark:相对于Pandas,实现两个DataFrame连接的方式有很多。Spark中的界面要简单得多。join只有一个关键字,但它也实现了多种重载方法。主要有以下三种用法://1.两个DataFrame有共同字段,连接条件只有一个,连接列名直接传入df1.join(df2,"col")//2。有多个字段,可以通过Seq字段传入多个字段df1.join(df2,Seq("col1","col2")//3.两个DataFrames中的连接字段名称不同。此时时候,需要传入判断连接条件df1.join(df2,df1("col1")===df2("col2"))//注意上面的连接条件中,等于用===,不等于用=!=3)where。数据过滤是所有数据处理过程的重要组成部分。在SQL中使用关键字where实现,在Pandas和Spark中都有相应的接口。熊猫。Pandas中实现数据过滤的方式有很多种,个人常用的主要有以下三种:通过loc定位运算符+逻辑判断条件实现过滤过滤。loc是一种读取数据的方法。由于它也支持逻辑判断条件的输入,所以也可以用来实现数据过滤。这是日常使用中最常用的方法;它是通过查询接口实现的。一提到查询,大家可能首先想到的就是SQL中的Q。实际上,pandas中的查询实现了标准SQL中的where语法。在实现链式过滤查询时非常有用。具体可以参考Pandas,已经用了一年了。这三个函数是我最喜欢的...where语句,Pandas以丰富的API着称,自然不会放过where关键字,可惜的是,Pandas中的where和Numpy中的where是一样的,都是用于allcolumns的所有元素进行相同的逻辑判断,可定制性差。火花。Spark中实现数据过滤的接口更简单,有两个关键字where和filter,两者的底层实现是一致的,所以实际上只有一种用法。但是在具体使用上,where也支持两种语法形式,一种是以字符串的形式传入类似SQL的条件表达式,类似于Pandas中的查询;另一种是显示每个列对象的逻辑判断,得到一组布尔结果,类似于Pandas中的loc操作。4)分组依据。groupby关键字用于分组和聚合。它实际上包括分组和聚合两个阶段。由于这个操作是一个比较规范的操作,所以Pandas和Spark也都提供了同名的关键字。不同的是groupby之后连接的运算符不一样。Pandas:Pandas中的groupby操作后面可以跟多个关键字。常用的其实包括以下4类:直接连接到聚合函数,如sum、mean等;连接到agg函数,传入多个聚合函数;connectedtotransform,并在聚合函数中传递,但不对结果进行聚合,即聚合前有N条记录,聚合后仍有N条记录,类似于SQL中的windowfunction函数。具体可以参考Pandas中groupby的这些用法。你知道吗?然后申请实现更多自定义功能,参考Pandas中的这三个功能。没想到成了我数据处理的主力军。Spark:Spark中的groupBy操作,常用的包括以下三种:直接访问聚合函数,如sum、avg等;连接到agg函数,传入多个聚合算子,类似Pandas;连接到数据透视表功能,实现特定的数据透视表功能。5)拥有。在SQL中,having用于对聚合统计后的结果进行过滤。和where最核心的区别在于过滤条件是聚合前的字段还是聚合后的字段。而这种差异在Pandas和Spark中是不存在的,所以和whereimplementation是一致的。6)选择。要选择特定的查询结果,请参阅PandasvsSpark:N种获取指定列的方法了解详情。7)截然不同。distinct在SQL中用于对查询结果进行去重。在Pandas和Spark中,实现这个操作的函数是drop_duplicates/dropDuplicates。8)订购方式。orderby用于按照指定的字段进行排序。Pandas和Spark中的实现如下:Pandas:sort_index和sort_values,其中前者根据索引排序,后者根据输入的列名字段排序,可以通过传入升序参数控制升序或降序命令。Spark:orderBy和sort,两者也是一样的底层实现,功能完全一样。同样是按输入域排序,可以分别用asc和desc函数实现升序和降序。//1。指定列+descdf.orderBy(df("col").desc)//2。desc函数添加指定列df.orderBy(desc("col"))9)限制。limit关键字用于限制返回结果的数量。这是一个功能比较单一的操作。两者的实现如下:Pandas:通过head关键字和iloc访问器可以提取指定数量的结果;Spark:直接内置的限制运算符,更接近SQL中的limit关键字。10)联盟。SQL中还有一个常用的查询关键字Union,在Pandas和Spark中也有实现:Pandas:concat和append,其中concat是Pandas中的顶层方法,可用于两个DataFrame的垂直拼接,需要列名对齐,而append相当于一个精简的concat实现,类似于Python中list的append方法,用于在一个DataFrame的末尾追加另一个DataFrame;Spark:Spark直接模仿了SQL的语法,提供了两个运算符,分别是union和unionAll。DataFrame的垂直拼接,和SQL中的意思完全类似。第03节对比了SQL标准查询语句中常用的关键字,重点介绍了Pandas和Spark中相应的操作。一般来说,这两种计算框架都可以用SQL实现所有的操作,但是Pandas实现的接口更丰富,参数传递更灵活;而Spark有更统一的接口,但普遍支持各种形式的方法重载。另外,Spark中的运算符命名更接近于SQL,语法习惯也与其非常相似,这使得SQL基础扎实的人更容易快速学习Spark。