目录
1、SparkSql概述
2、SparkSql Shell操作SparkSql
3、DataFrames API操作SparkSql
4、DataSets API操作SparkSql
5、多数据集抽象类型对比分析
6、经典问题
详情
1、SparkSql概述
-
1)混乱的前世今生
- 先出现的MapReduce,后本着sql on mr的思路,产生了Hive。
- MapReduce执行效率太慢,效率升级后产生了Tez,再效率升级后产生了Spark。
- Spark为了方便操作,本着sql on spark的思路产生了Shark,但Shark太多的借鉴和依赖Hive,制约了Spark的One Stack Rule Them All的既定方针,制约了Spark各个组件的相互集成
- 最后被Spark团队推翻和停更,推出了sql on spark新项目SparkSql,使sql on spark的发展方向上,得到质的提升。
-
2) SparkSql简介
-
SparkSql是什么
- Spark SQL是Spark处理数据的一个模块
- 专门用来处理结构化数据的模块, 像json,parquet,avro,csv,普通表格数据等均可。
- 与基础RDD的API不同,Spark SQL中提供的接口将提供给更多关于结构化数据和计算的信息,
并针对这些信息,进行额外的处理优化。
- 与基础RDD的API不同,Spark SQL中提供的接口将提供给更多关于结构化数据和计算的信息,
-
SparkSql操作方式说明
-
SparkSql shell
-
类似于hive shell
-
DataFrames API
-
最早专为sql on spark设计的数据抽象,与RDD相似,增加了数据结构scheme描述信息部分。
-
写spark代码,面向DF编程,可以与其它Spark应用代码无缝集成。
-
比RDD更丰富的算子,更有利于提升执行效率、减少数据读取、执行计划优化。
-
DataSets API
-
集成了RDD强类型和DataFrames结构化的优点,官方正强力打造的新数据抽象类型。
-
写spark代码,面向DS编程,可以与其它Spark应用代码无缝集成。
-
比RDD更丰富的算子,更有利于提升执行效率、减少数据读取、执行计划优化。
-
面向程序接口对接的操作:通过JDBC、ODBC等方式操作SparkSql
-
通过jdbc、odbc链接后,发送相关的sparksql请求,实现基于sparksql功能开发。
-
-
-
-
SparkSql的特点
-
可以利用SQL、DataFrams API、DataSets API或其它语言调用的基于sparksql模块计算,均是sparkcore执行引擎,其对计算的表达是独立的,即开发人员可以轻松在不同API之间切换实现相同的功能。
- 也可以通过命令行、JDBC、ODBC的方式来操作SparkSQL,方便其它数据平台、BI平台使用SparkSql模块。
- 在spark应用程序开发中,可以无缝使用SparkSql操作数据。
- 可以直接使用Hive表格数据。
- 与Hive的兼容性极好:它复用了Hive的前端(去掉驱动mapreduce执行任务的部分)和元数据,因此可以拿过来hivesql的东西在sparksql上运行即可。
- 并不是100%完全兼容,且绝大多数情况下,不需要改动,或只需要极小的改动!!!
比如个别版本不支持直接insert into table xxx values(xxx…)的插入数据的方式 - SparkSql的应用中,sql是一个重要方面,但不局限制sql。
-
SparkSql愿景
- 写更少的代码
- 读更少的数据
- 把优化的工作交由底层的优化器运行
- 把优化工作拿掉,我们并不需要做一些优化工作,也就是小白和高手写出来的应用程序最后的执行效率都是一样的。
-
-
3) Hadoop生态圈SQL相关重要名词解释
- SQL
- 面向数据编程的最高级抽象
- HQL=Hive Sql
- sql on hadoop的落地
- Hive on mr
- sql on mapreduce引擎
- Hive on tez
- sql on tez引擎
- Shark
- 早期发展的sql on spark项目,已废弃
- SQL
-
SparkSql
- spark团队主推的sql on spark项目,目前已相对成熟
- sql on spark商用的首选
- Hive on spark
- Hive团队的主推,但没有得到spark团队的强力支持。
* 是sql on spark的第2选择,但相对bug和使用复杂度略高
2、SparkSql Shell操作SparkSql
-
环境进入方式
//直接输入spark-sql+自己想要添加的参数即可,与spark-shell相似
spark-sql [options]
//如指定运行模式
spark-sql local[*]
//如指定运行spark webui服务的端口,解决多人共用一个入口机时候的进入时候报port bind exception的问题
spark-sql --conf spark.ui.port=4075
//也可以用于似于hive -e的方式,直接直接一段sparksql代码-
成功进入后状态
-
操作方式
- 使用方式融合几乎全部hive操作:集成了hive前端使用+元数据信息
-
DDL、DML、DQL
- 创建库
- 创建表
- 删除表
- 数据装载(不支持直接insert into table … values(…)方式)
- 更多的系统函数,包含全部的hive系统函数
- 添加自定义udf/udaf/udtf等
- 动态自定义分区
- hive数据分析数
- 及其它hive的各项功能
-
- 使用方式融合几乎全部hive操作:集成了hive前端使用+元数据信息
-
3、DataFrames API操作SparkSql
-
1)开发环境搭建步骤
- 与之Sbt构建SparkWordCount步骤完全一样。
- 将Spark-Sql库依赖,加入build.sbt
- sbt reload
- sbt eclipse
- eclipse项目中进行刷新操作
- spark-sql依赖库
“org.apache.spark” %% “spark-sql” % “1.6.2” % “provided”
- 与之Sbt构建SparkWordCount步骤完全一样。
-
2 ) DataFrames相关操作
- 创建DataFrames
package com.tl.job003.sql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
object SparkSqlTest {
def main(args: Array[String]) {
val conf = new SparkConf()
conf.setMaster(“local”);
conf.setAppName(“TestSparkSql”);
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
// 添加将RDD转化为DataFrame的功能包引入
import sqlContext.implicits._
val df = sqlContext.read.json(“file:\E:\test\job003\sparksql\input_weibo.json”)
df.show();
sc.stop();
}
}
DataFrame常用操作
-
常用命令
- show
- printSchema
- select
- filter
- groupBy
- count
- orderBy
- 其它操作类比于sql即可
-
综合示例
package com.tl.job003.sql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
object SparkSqlTest {
def main(args: Array[String]) {
val conf = new SparkConf()
conf.setMaster(“local”);
conf.setAppName(“TestSparkSql”);
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
// 添加将RDD转化为DataFrame的功能包引入
import sqlContext.implicits._
val df = sqlContext.read.json(“file:\E:\test\job003\sparksql\input_weibo.json”)
//默认显示内容的top20
df.show()
// 打印内容对应的表结构
df.printSchema()
// 选择内容当中的某一个列对应的内容
df.select(“content”).show()
// 选择任意列并进行自定义操作
df.select(df(“content”), df(“commentCount”), df(“commentCount”) + 10000).show()
// 选择评论数大于100的数据显示出来
df.filter(df(“commentCount”) > 100).show()// 按userId进行分组计数统计 df.groupBy("userId").count().show() //分组统计结果按默认升序排列 df.groupBy("userId").count().orderBy("count").show() //分组统计结果按降序排列 import org.apache.spark.sql.functions._ df.groupBy("userId").count().orderBy(desc("count")).show() sc.stop();
}
}
未完待续,csdn的编辑器太难用了。。。。。。
天亮教育是一家从事大数据云计算、人工智能、教育培训、产品开发、咨询服务、人才优选为一体的综合型互联网科技公司。
公司由一批BAT等一线互联网IT精英人士创建,
以"快乐工作,认真生活,打造高端职业技能教育的一面旗帜"为愿景,胸怀"让天下没有难找的工作"使命,
坚持"客户第一、诚信、激情、拥抱变化"的价值观,
全心全意为学员赋能提效,践行技术改变命运的初心。
更多学习讨论, 请加入
官方-天亮大数据交流-366784928
群二维码:
天亮教育公开课-从小白到大佬修成记-全系列视频地址:http://bbs.myhope365.com/forum.php?mod=viewthread&tid=1422&extra=page%3D1
欢迎关注天亮教育公众号,大数据技术资料与课程、招生就业动态、教育资讯动态、创业历程分享一站式分享,官方微信公众号二维码:
天亮教育官方群318971238,
爬虫、nlp技术qq群320349384
hadoop & spark & hive技术群297585251
教育培训官网:http://myhope365.com
项目研发官网:http://shangyuninfo.com/
官方天亮论坛:http://bbs.myhope365.com/