Spark SQL 初识

今天我们们学习一下Spark 的最最核心的组件,也是Spark中代码量最大,社区花费大量精力的模块

在实际工作中,使用频率最高的当属 Spark SQL,通常一个大数据处理项目中,70% 的数据处理任务都是由 Spark SQL 完成,它贯穿于数据预处理、数据转换和最后的数据分析。由于 SQL 的学习成本低、用户基数大、函数丰富,Spark SQL 也通常是使用 Spark 最方便的方式。此外,由于 SQL 包含了丰富的应用语义,所以 Catalyst 优化器带来的性能巨大提升也使 Spark SQL 成为编写 Spark 作业的最佳方式

由于 Spark 对于 SQL 支持得非常好,而 pandas 在这方面没那么强大,所以,在某些场景,你可以选择 Spark SQL 来代替 pandas,这对于分析师来说非常好用,但是最新版的Spark 已经支持了pandas,这算是数据分析师的福音了。

Spark SQL的地位

首先我们看一下,Spark SQL在Spark家族中的地位

其实我们可以看到Spark SQL 最终还是依赖底层的Spark Core,也就是说最终还是转化到RDD 上执行,既然最终都是转化到RDD 上执行,为什么我们不直接使用RDD 呢,后面我们在解释这个问题。

接下来我们看一下Spark提供的这几个模块在社区中的使用情况,其实从下面的图中我们可到,使用最广泛的还是Spark SQL几乎占据了半壁江山,这也就是我们为什么要重点学习Spark SQL了

为什么要有Spark SQL

自从 Spark 社区在 1.3 版本发布了 DataFrame,它就开始代替 RDD,逐渐成为开发者的首选。我们知道,新抽象的诞生一定是为了解决老抽象不能搞定的问题。那么,这些问题都是什么呢?下面,我们就一起来分析一下。

RDD之殇—优化空间有限

自从 Spark 社区在 1.3 版本发布了 DataFrame,它就开始代替 RDD,逐渐成为开发者的首选。我们知道,新抽象的诞生一定是为了解决老抽象不能搞定的问题。那么,这些问题都是什么呢?下面,我们就一起来分析一下。

我们知道在 RDD编程中很多 转换和聚合算子,它们都是高阶函数,例如我们最常用的ma、filter、reduceBykey,高阶函数指的是形参包含函数的函数,或是返回结果包含函数的函数。为了叙述方便,我们把那些本身是高阶函数的 RDD 算子,简称“高阶算子”。

对于这些高阶算子,开发者需要以 Lambda 函数的形式自行提供具体的计算逻辑。以 map 为例,我们需要明确对哪些字段做映射,以什么规则映射。再以 filter 为例,我们需要指明以什么条件在哪些字段上过滤。

但这样一来,Spark 只知道开发者要做 map、filter,但并不知道开发者打算怎么做 map 和 filter。也就是说,在 RDD 的开发模式下,Spark Core 只知道“做什么”,而不知道“怎么做”。这会让 Spark Core 两眼一抹黑,除了把 Lambda 函数用闭包的形式打发到 Executors 以外,实在是没有什么额外的优化空间

对于 Spark Core 来说,优化空间受限最主要的影响,莫过于让应用的执行性能变得低下。一个典型的例子,就是相比 Java 或者 Scala,PySpark 实现的应用在执行性能上相差悬殊。原因在于,在 RDD 的开发模式下,即便是同一个应用,不同语言实现的版本在运行时也会有着天壤之别。

所以这就是为什么Spark SQL一直致力于优化性能

RDD之殇—通用性不高

其实我们知道使用最广泛的编程语言其实是SQL,而且入门门槛低,我们知道Spark底层是使用scala 语言实现的,这也就是我们的spark 编程一般都是使用scala,但是我们很多数据工作者一直都是使用SQL 的。

所以Spark SQL可以弥补Spark在这一方面的不足,但是这不是说Spark SQL就是SQL,它更多的是优化,然后提供了一个 SQL的编程接口。

Spark SQL 编程模式

编程入口

Spark SQL的编程入口是SparkSession,在 Spark 版本演进的过程中,从 2.0 版本开始,SparkSession 取代了 SparkContext,成为统一的开发入口。换句话说,要开发 Spark 应用,你必须先创建 SparkSession,SparkSession持有了SparkContext的引用,所以你可以通过SparkSession实例获取SparkContext对象

val sparkConf = new SparkConf().setAppName("DataLoadAndParse").setMaster("local[2]")
val spark = SparkSession.builder().config(sparkConf).getOrCreate()
val sparkContext = spark.sparkContext

DataFrame 编程

DataFrame 是Spark SQL提供的一个数据结构,底层依赖RDD 也就是Spark Core, 因为DataFrame有了数据类型的信息,所以Spark SQL可以更好的去优化底层层存储,再加上对DataFrame的操作Spark是可以提前感知的,所以在执行的时候也可以更好的去优化。

既然DataFrame是Spark SQL提供的数据结构,那么Spark SQL也在这个数据结构之上定义了很多操作,这些操作可以很方便的完成我们的业务逻辑。

val data=spark.read.option("header", true).csv(path).select("ts_code","trade_date","open","high","low","close","pre_close","change","pct_chg","vol","amount")data.groupBy("trade_date").count.show()

这里我们就是统计了一下股票市场上,每天有多少只股票

SQL 编程

对于很多人不熟悉DataFrame,那Spark SQL 也给你提供了 SQL模式的编程,可以参考下面

val data=spark.read.option("header", true).csv(path).select("ts_code","trade_date","open","high","low","close","pre_close","change","pct_chg","vol","amount")// close 收盘价   pre_close 昨收价  change 涨跌额  pct_chg  涨跌幅   vol 成交量 (手)  amount  成交额 (千元)data.createOrReplaceTempView("trade")import spark.sqlsql("""|select|   trade_date,count(1) as cnt|from|   trade|group by|   trade_date|""".stripMargin).show()

混合编程

混合编程就是我们可以在一段逻辑里面同时SQL 编程和DataFrame 编程

总结

Spark SQL 是Spark 的最最核心的组件,也是Spark中代码量最大,社区花费大量精力的模块。

Spark SQL可以很方便高效的完成数据清洗数据分析的业务逻辑,主要是性能高和使用方便。

Spark SQL提供了三种编程模式,以及SQL 命令行可以配合Hive 一起使用,这也是使用最广泛的场景。

Spark SQL 初识相关推荐

  1. 初识Spark2.0之Spark SQL

    内存计算平台Spark在今年6月份的时候正式发布了spark2.0,相比上一版本的spark1.6版本,在内存优化,数据组织,流计算等方面都做出了较大的改变,同时更加注重基于DataFrame数据组织 ...

  2. spark SQL入门指南《读书笔记》

    文章目录 spark SQL入门指南 第一章 初识 spark mysql 1.1 Spark的诞生 和SparkSQL是什么? 1.2 Spark SQL能做什么? 第2章 Spark安装.编程环境 ...

  3. Spark SQL基本操作以及函数的使用

    2019独角兽企业重金招聘Python工程师标准>>> 引语: 本篇博客主要介绍了Spark SQL中的filter过滤数据.去重.集合等基本操作,以及一些常用日期函数,随机函数,字 ...

  4. Spark SQL与外部数据源的操作(Spark SQL ——> CSV/JSON/Parquet/hive/mysql)

    目录 一.Spark SQL支持的外部数据源 二.Spark SQL -> CSV 2.1 读CSV文件 a.有列名 b.无列名 2.2 写CSV文件 三.Spark SQL -> JSO ...

  5. 【Spark Summit East 2017】Spark SQL:Tungsten之后另一个可以达到16倍速度的利器

    更多精彩内容参见云栖社区大数据频道https://yq.aliyun.com/big-data:此外,通过Maxcompute及其配套产品,低廉的大数据分析仅需几步,详情访问https://www.a ...

  6. 【未完成】[Spark SQL_2] 在 IDEA 中编写 Spark SQL 程序

    0. 说明 在 IDEA 中编写 Spark SQL 程序,分别编写 Java 程序 & Scala 程序 1. 编写 Java 程序 待补充 2. 编写 Scala 程序 待补充 转载于:h ...

  7. spark sql 本地调试_Spark精华问答|Spark的三种运行模式有何区别?

    戳蓝字"CSDN云计算"关注我们哦! Spark是一个针对超大数据集合的低延迟的集群分布式计算系统,比MapReducer快40倍左右,是hadoop的升级版本,Hadoop作为第 ...

  8. spark SQL学习(综合案例-日志分析)

    日志分析 scala> import org.apache.spark.sql.types._ scala> import org.apache.spark.sql.Rowscala> ...

  9. Adaptive Execution让Spark SQL更高效更好用

    本文所述内容均基于 2018年9月17日 Spark 最新 Spark Release 2.3.1 版本,以及截止到 2018年10月21日 Adaptive Execution 最新开发代码.自动设 ...

最新文章

  1. python中的成员运算符用于判断什么_Python之运算符
  2. 【C++】 C++标准模板库(十) 双向队列
  3. No slave process to process jobs, aborting 报错!!!
  4. 深入理解javascript原型链
  5. 不用 SWIG,Go 使用 C++ 代码的方式
  6. cfree mysql_如何配置CFree才能开发MySql数据库应用 | 学步园
  7. 相反数-网易校招编程题
  8. Python3入门机器学习经典算法与应用 第3章 Numpy中的arg运算
  9. 深度学习——时间序列模型评价指标总结
  10. 网易企业邮箱:与POP3、WebMail相比,为什么Imap4更被接受
  11. matlab解简单数学规划(线性,非线性,整数规划)
  12. RoadRunner中自建地图并作为Carla Map笔记
  13. 【Linux】Shell脚本中如何使用“循环”遍历“数组”中的元素(包括MySQL的常用指令介绍)
  14. Pyhton语言介绍
  15. 7所大学提供区块链、加密货币及金融科技相关线上课程
  16. ikun请进|爱心代码表白蔡徐坤来了
  17. C++开发对对碰游戏
  18. 80后凭栏碎念青春阑珊
  19. 测试总结该怎么写才高级?
  20. 【紧急】Apache Log4j2 远程代码执行漏洞

热门文章

  1. 研发工程师入门——Linux系统基础
  2. 数据结构程序设计——山东省城际铁路建设建设
  3. Planet比Google earth更好用的地图下载神器Basemaps Viewer不用写代码全球高清影像框选下载tif格式
  4. win10网络不出现计算机列表,win10系统电脑不显示无线网络的解决方法
  5. java游戏宠物进化,[娱乐][SCT]imiPet —— 动态动作模型的宠物开源,由社区维护[1.9-1.16]...
  6. 传奇登录器自动获取服务器,gom引擎配置登录器补丁读取规则的说明
  7. Swift Markup Formatting Syntax
  8. php绕过宝塔,一句命令绕过宝塔面板强制绑定账号
  9. coures包下载和安装 可解决报错ImportError: No module named '_curses'
  10. 漂亮的评论功能的html页面,「评论」功能设计总结