一、简介

  Spark SQL 提供了以下三大功能。
   (1) Spark SQL 可以从各种结构化数据源(例如 JSON、Hive、Parquet 等)中读取数据。
   (2) Spark SQL 不仅支持在 Spark 程序内使用 SQL 语句进行数据查询,也支持从类似商业智能软件 Tableau 这样的外部工具中通过标准数据库连接器(JDBC/ODBC)连接 SparkSQL 进行查询。
   (3) 当在 Spark 程序内使用 Spark SQL 时,Spark SQL 支持 SQL 与常规的 Python/Java/Scala代码高度整合,包括连接 RDD 与 SQL 表、公开的自定义 SQL 函数接口等。这样一来,许多工作都更容易实现了。

二、Spark SQL基本示例

  

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.sql.SQLContext object Test {
def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("test").setMaster("local[4]")
val sc = new SparkContext(conf)
sc.setLogLevel("WARN") // 设置日志显示级别
val hiveCtx = new HiveContext(sc)
val input = hiveCtx.jsonFile("tweets.json")
input.registerTempTable("tweets")
// hiveCtx.cacheTable("tweets") 缓存表
// input.printSchema() // 输出结构信息
val topTweets = hiveCtx.sql("SELECT user.name,text FROM tweets")
topTweets.collect().foreach(println) }
}

  

三、SchemaRDD

  读取数据和执行查询都会返回 SchemaRDD。SchemaRDD 和传统数据库中的表的概念类似。从内部机理来看,SchemaRDD 是一个由 Row 对象组成的 RDD,附带包含每列数据类型的结构信息。 Row 对象只是对基本数据类型(如整型和字符串型等)的数组的封装。在 Spark 1.3 版本以后,SchemaRDD 这个名字被改为 DataFrame。SchemaRDD 仍然是 RDD,所以你可以对其应用已有的 RDD 转化操作,比如 map() 和filter() 。

  SchemaRDD 可以存储一些基本数据类型,也可以存储由这些类型组成的结构体和数组。

  

   

四、缓存

  Spark SQL 的缓存机制与 Spark 中的稍有不同。由于我们知道每个列的类型信息,所以Spark 可以更加高效地存储数据。为了确保使用更节约内存的表示方式进行缓存而不是储存整个对象,应当使用专门的 hiveCtx.cacheTable("tableName") 方法。当缓存数据表时,Spark SQL 使用一种列式存储格式在内存中表示数据。这些缓存下来的表只会在驱动器程序的生命周期里保留在内存中,所以如果驱动器进程退出,就需要重新缓存数据。和缓存RDD 时的动机一样,如果想在同样的数据上多次运行任务或查询时,就应把这些数据表缓存起来。

五、读取和存储数据

1、 Apache Hive  

  当从 Hive 中读取数据时,Spark SQL 支持任何 Hive 支持的存储格式,包括文本文件、RCFiles、ORC、Parquet、Avro,以及 Protocol Buffer。要把 Spark SQL 连接到已经部署好的 Hive 上,你需要提供一份 Hive 配置。你只需要把你的 hive-site.xml 文件复制到 Spark 的 ./conf/ 目录下即可。如果你只是想探索一下 Spark SQL而没有配置 hive-site.xml 文件,那么 Spark SQL 则会使用本地的 Hive 元数据仓,并且同样可以轻松地将数据读取到 Hive 表中进行查询。

// 使用 Scala 从 Hive 读取
val hiveCtx = new HiveContext(sc)
val rows = hiveCtx.sql("SELECT key, value FROM mytable")
val keys = rows.map(row => row.getInt(0))

2、Parquet

  Parquet(http://parquet.apache.org/)是一种流行的列式存储格式,可以高效地存储具有嵌套字段的记录。Parquet 格式经常在 Hadoop 生态圈中被使用,它也支持 Spark SQL 的全部数据类型。Spark SQL 提供了直接读取和存储 Parquet 格式文件的方法。可以通过 HiveContext.parquetFile 或者 SQLContext.parquetFile 来读取数据。

3、JSON

  要读取 JSON 数据,只要调用 hiveCtx 中的 jsonFile() 方法即可。如果你想获得从数据中推断出来的结构信息,可以在生成的 SchemaRDD 上调用printSchema 方法。

4、基于RDD

  除了读取数据,也可以基于 RDD 创建 DataFrame。

/**SQLContext 创建 DataFrame **/
def createDtaFrame(sparkCtx:SparkContext,sqlCtx:SQLContext):Unit = {
val rowRDD = sparkCtx.textFile("D://TxtData/studentInfo.txt").map(_.split(",")).map(p => Row(p(0),p(1).toInt,p(2)))
val schema = StructType(
Seq(
StructField("name",StringType,true),
StructField("age",IntegerType,true),
StructField("studentNo",StringType,true)
)
)
val dataDF = sqlCtx.createDataFrame(rowRDD,schema) //df注册到内存表
dataDF.registerTempTable("Student")
val result = sqlCtx.sql("select * from Student")
result.show() // dataDF.select("name").show()
// dataDF.filter(dataDF("age") <14).show()
// dataDF.where("age <> ''").show()
}

5、Spark SQL UDF

  用户自定义函数,也叫 UDF,可以让我们使用 Python/Java/Scala 注册自定义函数,并在 SQL中调用。这种方法很常用,通常用来给机构内的 SQL 用户们提供高级功能支持,这样这些用户就可以直接调用注册的函数而无需自己去通过编程来实现了。在 Spark SQL 中,编写UDF 尤为简单。Spark SQL 不仅有自己的 UDF 接口,也支持已有的 Apache Hive UDF。

    //  写一个求字符串长度的UDF  原书代码会报错,查阅官方文档得知
hiveCtx.udf.register("strLenScala", (_: String).length)
val tweetLength = hiveCtx.sql("SELECT strLenScala('tweet') FROM tweets LIMIT 10")

  注意:因为Spark版本的原因,原书的代码会报错,有一个好的解决方式,就是查阅官方文档。

  

六、Spark SQL性能

  Spark SQL 提供的高级查询语言及附加的类型信息可以使 SparkSQL 数据查询更加高效。

  Spark SQL 的性能调优选项如下表所示

  

  在一个传统的 Spark SQL 应用中,可以在 Spark 配置中设置这些 Spark 属性。

// 在 Scala 中打开 codegen 选项的代码
conf.set("spark.sql.codegen", "true")

  Spark Sql官方文档

  这篇博文主要来自《Spark快速大数据分析》这本书里面的第九章,内容有删减,还有本书的一些代码的实验结果。还要注意一点,在以后的学习中要养成查阅官方文档的习惯。

Spark学习之Spark SQL的更多相关文章

  1. Spark学习之Spark SQL(8)

    Spark学习之Spark SQL(8) 1. Spark用来操作结构化和半结构化数据的接口--Spark SQL. 2. Spark SQL的三大功能 2.1 Spark SQL可以从各种结构化数据 ...

  2. Spark学习之Spark Streaming(9)

    Spark学习之Spark Streaming(9) 1. Spark Streaming允许用户使用一套和批处理非常接近的API来编写流式计算应用,这就可以大量重用批处理应用的技术甚至代码. 2. ...

  3. Spark学习之Spark调优与调试(7)

    Spark学习之Spark调优与调试(7) 1. 对Spark进行调优与调试通常需要修改Spark应用运行时配置的选项. 当创建一个SparkContext时就会创建一个SparkConf实例. 2. ...

  4. Spark学习一:Spark概述

    1.1 什么是Spark ​ Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎. ​ 一站式管理大数据的所有场景(批处理,流处理,sql) ​ spark不涉及到数据的存储,只 ...

  5. Spark学习笔记--Spark在Windows下的环境搭建

    本文主要是讲解Spark在Windows环境是如何搭建的 一.JDK的安装 1.1 下载JDK 首先需要安装JDK,并且将环境变量配置好,如果已经安装了的老司机可以忽略.JDK(全称是JavaTM P ...

  6. Spark学习(一) Spark初识

    一.官网介绍 1.什么是Spark 官网地址:http://spark.apache.org/ Apache Spark™是用于大规模数据处理的统一分析引擎. 从右侧最后一条新闻看,Spark也用于A ...

  7. Spark学习笔记--Spark在Windows下的环境搭建(转)

    本文主要是讲解Spark在Windows环境是如何搭建的 一.JDK的安装 1.1 下载JDK 首先需要安装JDK,并且将环境变量配置好,如果已经安装了的老司机可以忽略.JDK(全称是JavaTM P ...

  8. Spark学习(4) Spark Streaming

    什么是Spark Streaming Spark Streaming类似于Apache Storm,用于流式数据的处理 Spark Streaming有高吞吐量和容错能力强等特点.Spark Stre ...

  9. Spark学习之Spark Streaming

    一.简介 许多应用需要即时处理收到的数据,例如用来实时追踪页面访问统计的应用.训练机器学习模型的应用,还有自动检测异常的应用.Spark Streaming 是 Spark 为这些应用而设计的模型.它 ...

随机推荐

  1. java之web开发过滤器

    我们通常上网的时候都会遇到一个问题,看到一个视频之类的,想要点开观看,点击之后,网页 提醒你:您尚未登录,是否要登录?然后巴拉巴拉跑去输账号密码. 那么这就是一个过滤器的功能,当你要访问一个资源的时候 ...

  2. YOLO_Online 将深度学习最火的目标检测做成在线服务实战经验分享

    YOLO_Online 将深度学习最火的目标检测做成在线服务 第一次接触 YOLO 这个目标检测项目的时候,我就在想,怎么样能够封装一下让普通人也能够体验深度学习最火的目标检测项目,不需要关注技术细节 ...

  3. python new和init知识点

    __new__ 方法是什么?如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参 数则是生产所需原料,__init__()方法会按照方法中的语句 ...

  4. 关于ajax原理阐述

    ajax是什么呢?说白了就是一个请求,一个读取服务器资源以及提交资源到服务器的中间处理机制,那它具体是怎样工作的,又有怎样的原理呢?var ajax=function(url,fnSucceed,fn ...

  5. SpringBoot开发案例从0到1构建分布式秒杀系统

    前言 ​最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路.俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场 ...

  6. 谈论seo思维性对优化中起到决定性的作用

    在<SEO的艺术>又出版之后,SEO艺术更加受到了广大SEOer的关注和热捧,在这本书里面,也有很多的不为人知的技巧分享.SEO的艺术强调的是SEO融入网络营销,融入社会化媒体大潮,然而这 ...

  7. 免密登录-python

    要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前,还有一个重要的事情要处理,那就 ...

  8. Python基础之Windows下Python3.x环境搭建

    本文介绍使用Python3.x搭建Python环境,文章最后将使用Windows自带的cmd写一个简单的Python程序. 下载Python环境安装包 在https:/www.python.org/下 ...

  9. oracle中数据类型对应java类型

    地址: http://otndnld.Oracle.co.jp/document/products/oracle10g/102/doc_cd/Java.102/B19275-03/datacc.htm ...

  10. How to distribute a database among microservices

    在为相对复杂的企业域构建微服务时,我们需要找到在这个域中不同责任的边界.在每个边界中,我们会创建领域模型,这个模型是针对业务责任所设计的,并反映了这种业务责任.针对每个边界的数据模型会由同一个边界中的 ...