dataframe及sql

本文详细介绍了 SparkSQL 的运行架构,包括 SQL 语句的解析、绑定、优化及执行流程。并通过实例展示了如何使用 PySpark 创建 DataFrame,执行 SQL 查询,以及数据结构的生成方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sparksql 运行架构:

SparkSQL语句的顺序为:

1. 对读入的SQL语句进行解析(Parse),分辨出SQL语句的关键词(如SELECT、FROM、WHERE 并判断SQL语句的合法性;

2. 将SQL语句和数据库的数据字典进行绑定(Bind)如果相关的Projection、Data Source等都是存在的话,就表示这个SQL语句是可以执行的;

3. 数据库会在这计划中选择一个最优计划(Optimize)

4. 计划执行(Execute),按Operation-->Data Source-->Result的次序来进行的,在执行过程有时候不需要读取物理表就可以返回结果,如重新运行刚运行过的SQL语句,可能直接从数据库的缓冲池中获取返回结果。

实现spark SQL:

1,产生SchemaRDD -- 为了实现SPARKSQL必须将一般的RDD转换成带数据结构的数据集DataFrame

2,SchemaRDD 本身是一个RDD,但它本身包含是由行对象(row object)组成。每个行对象代表一条记录

3, SchemaRDD 提供了一些新的操作应用函数使得数据操作和分析更高效和简洁

4,可以将SchemaRDD注册成表. 这样就可以用SQL访问RDD的数据了。而结果集本身也是SchemaRDD 即 DataFrame

5,可以用各种方法生成SchemaRDD

用createDataFrame 产生dataframe

from pyspark.sql import Row
from pyspark.sql import *
sqlContext= SQLContext(sc)
print(sqlContext)
eDF=sqlContext.createDataFrame([Row(a=1,b="男",c=50),Row(a=2,b="女",c=78)])
eDF.show()

运行结果


用sc.parallelize 产生DataFrame

namelist=['john','marry','lily']
agelist=[23,34,43]
gradelist=[89,95,46]
data=zip(namelist,agelist,gradelist)
df=sc.parallelize(data).toDF(schema=['name','age','grade'])
df.registerTempTable("stu")#使用registertemptable 创建一个临时表
dfs=sqlContext.sql("select name,age from stu ")#使用sql语句 进行查询
print(dfs.show())
df.show()

运行结果



用python list 产生dataframe

spark=SQLContext(sc)
a=range(20)
b=[i*2 for i in range(20)]
df=spark.createDataFrame(zip(a,b),("id",'value'))
#print(df.collect())
df.registerTempTable("mytable") #registerTepTable创建一个临时表
mytabledf=spark.sql("SELECT id,value from mytable where id=10")#使用sql 语句进行查询
mytabledf.show()
mytablesum=spark.sql("select sum(value) as sumy from mytable where id>=15")
mytablesum.show()


shark的概念:

shark 简单 的说是spark上的hive, 其底层依赖于hive引擎

但是在spark 平台上, shark 的解析速度是hive 的几多倍

它就是hive在spark上的体现,并且是升级版, 一个强大的数据仓库, 并且是兼容hive语法的

编程产生数据结构:

from pyspark.sql.types import *#需要导入 模块
fs=StructType([StructField('id',IntegerType(),True),StructField('name',StringType(),True)])
ids=[1,2,3,4]
names=["aa",'bb','cc','dd']
rdd=sc.parallelize(zip(ids,names))
df=rdd.toDF(fs)
df.show()

运行结果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值