Spark SQL详解

Spark SQL是Spark的核心组件,旨在提供易整合、统一的数据访问方式,兼容Hive。Catalyst优化器是其运行原理的关键,负责将SQL逻辑转化为执行计划。Spark SQL API包括SparkContext、SQLContext、HiveContext、SparkSession、Dataset和DataFrame等,支持多种数据源操作,如Parquet和Hive表。此外,还介绍了RDD、Dataset和DataFrame之间的转换以及性能优化策略。
摘要由CSDN通过智能技术生成

Spark SQL原理

1.Spark SQL概述
(1)概念:
Spark SQL 是 Spark 1.0 的新加入成员,前身是 Shark。
(2)shark的初衷:
①让Hive运行在Spark之上
②是对Hive的改造,继承了大量Hive代码,给优化和维护带来了大量的麻烦
(3)Spark SQL覆盖了shark的功能,并且拜托了Hive的依赖
(4)Spark SQL特点:
①易整合
②统一的数据访问方式
③兼容Hive
2.Spark SQL架构
(1)Spark SQL是Spark的核心组件之一
(2)能够直接访问现存的Hive数据
(3)提供JDBC/ODBC接口供第三方工具借助Spark进行数据处理
(4)提供了更高层级的接口方便地处理数据
(5)支持多种操作方式:SQL、API编程
(6)支持多种外部数据源:Parquet、JSON、RDBMS等

3.Spark SQL运行原理
(1)核心:
Catalyst是Spark SQL的核心。所有 SQL 操作最终都通过 Catalyst 翻译成类似的 Spark 程序代码被 Spark Core 调度执行。
(2)Catalyst优化器
对于 Spark SQL 来说,从 SQL 到 RDD 的执行需要经过两个大的阶段,分别是逻辑计划和物理计划。Catalyst 优化器,作用便是将逻辑计划转为物理计划。
在这里插入图片描述
①逻辑计划

SELECT name FROM
(
    SELECT id, name FROM people
) p
WHERE p.id = 1

②优化
在投影上面查询过滤器
检查过滤是否可下压
在这里插入图片描述

③物理计划
在这里插入图片描述

Spark SQL API

1.基本组成
(1)SparkContext
Spark的主入口
(2)SQLContext
Spark SQL的编程入口
(3)HiveContext
SQLContext的子集,包含更多功能
(4)SparkSession(Spark2.x+才有)

val spark = SparkSession.builder
                    .master("local[*]")
                    .appName("appName")
                    .getOrCreate()

①合并了SQLContext和HiveContext
②提供了Spark功能交互单一入口点,并允许使用DataFrame和Dataset API对Spark进行编程
(5)Dataset
特定域对象中的强类型集合

scala> spark.createDataset(1 to 3).show
scala> spark.createDataset(List(("a",1),("b",2),("c",3))).show
scala> spark.createDataset(sc.parallelize(List(("a",1,1),("b",2,2)))).show

①createDataset()的参数可以是:Seq、Array、RDD
②上面三行代码生成的Dataset分别是:
Dataset[Int]、Dataset[(String,Int)]、Dataset[(String,Int,Int)]
③Dataset=RDD+Schema,所以Dataset与RDD有大部共同的函数,如map、filter等

(6)DataFrame
①DataFrame=Dataset[Row]
②类似传统数据的二维表格
③在RDD基础上加入了Schema(数据结构信息)
④DataFrame Schema支持嵌套数据类型(struct,map,array)
⑤提供更多类似SQL操作的API

2.使用Case Class创建Dataset
(1)直接创建

case class Point(label:String,x:Double,y:Double)
case class Category(id:Long,name:String)
val points=Seq(Point("bar",3.0,5.6),Point("foo",-1.0,3.0)).toDS
val categories=Seq(Category(1,"foo"), Category(2,"bar")).toDS
points.join(categories,points("label")===categories("name")).show

(2)RDD->Dataset

import spark.implicits._
case class Point(label:String,x:Double,y:Double)
case class Category(id:Long,name:String)
val pointsRDD=sc.parallelize(List(("bar",3.0,5.6),("foo",-1.0,3.0)))
val categoriesRDD=sc.parallelize(List((1,"foo"),(2,"bar")))
val points=pointsRDD.map(line=>Point(line._1,line._2,line._3)).toDS
val categories=categories.map(line=>Category(line._1,line._2)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值