(一)SparkSQL 学习笔记

简介

SparkSQL是 Spark 计算框架的一个模块,与基础 Spark RDD API 不同,SparkSQL 为 Spark 提供了更多 数据结构schema 信息,在内部,SparkSQL 使用这些额外的数据结构信息做进一步的优化操作,与 SparkSQL 交互的方式有多种,包括 SQL语句交互、DatasetAPI 交互。当使用 SparkSQL 获取数据处理结果时,无论使用什么样的交互方式,无论采用什么样的语言编写程序,其底层的执行引擎都是相同的。
在这里插入图片描述

SparkSQL 是以SparkRDD 为基础,以SQL方式做大数据分析。其只能针对结构化数据或半结构化数据做分析,无法对非结构化数据做分析。

SparkSQL 基本介绍

SQL语句交互

SparkSQL 的用处之一是执行 SQL 查询,SparkSQL 也可以从已有 Hive 数据仓库中读取数据(Spark On Hive)。SparkSQL 语句的执行结果是一个 DataFrame 或 Dataset对象。同时支持命令行执行 SQL 和JDBC/ODBC 连接。

Datasets API 交互

Dataset 是一个分布式的数据集合。在Spark1.6版本中,Dataset 作为一个新街口添加进来,兼具有 RDD 的优点(强类型、使用强大的Lambda 函数的功能)和 SparkSQl 优化引擎的优势。Dataset 可以从 JVM 对象来构建,然后使用一系列转换函数进行计算。

DataFrame(Dataset<Row>)是一个由命名列组成的 Dataset。概念上相当于关系型数据库中的一个表,但底层提供了丰富的优化操作。DataFrames 可以从一系列广泛的数据来源中构建,如结构化数据文件,Hive 中的表、外部数据库、或者已有的 RDD。

Dataset: 具有强类型的特定。Dataset中,每一行是什么类型是不一定的,在自定义了case class之后可以很自由的获得每一行的信息。
DataFrame:DataFrame每一行的类型固定为Row,只有通过解析才能获取各个字段的值;是分布式的Row对象的集合。

DataFrame和DataSet可以相互转化,df.as[ElementType]这样可以把DataFrame转化为DataSet,ds.toDF()这样可以把DataSet转化为DataFrame。

如 RDD 与DataFrame 的区别
在这里插入图片描述

SparkSession

SparkSession 提供了与底层 Spark功能交互的入口,允许使用 DataFrame 和 Dataset API 对 Spark 进行编程。最重要的是:它限制了概念的数量(SparkContext,SQLContext,HiveContext),并构建了开发人员与 Spark 交互时必须兼顾的结构。

启动 Spark-shell 控制台后,SparkSession 被实例化为 spark 变量,在控制台中可以直接使用。
在这里插入图片描述

partition 分区

为了使每个 executor 执行器并行执行任务,Spark 将数据分为 partition。每个分区是集群中的一个物理机器上的集合。DataFrame 的分区表示在执行过程中数据时如何在集群上物理分布的。

对于 DataFrame 操作,大多数情况下不需要手动或单独操作分区,因为使用 DataFrame 的高级 transformation 操作,底层会做一些优化操作,然后转化为 RDD 进行计算。

transformation

执行一个简单的转换,以在当前的 DataFrame 中找到所有偶数:

val myRange = spark.range(1000).toDF("number")
val divisBy2 = myRange.where("number % 2=0")

这里只是申明了一个抽象转换 where,直到调用一个 action 操作,Spark 才开始进行转换操作。

延迟计算

延迟计算意味着 spark 将等到最后一刻才执行一系列的 transformation。在 SparkSQL 中,不会在执行某个 transformation 操作时立即修改数据,spark 会构建一个引用于源数据的 plan。直到最后 action 时执行代码,Spark 将这个计划从原始的 DataFrame 转化为 Physical Plan(物理计划),该计划将在整个集群中高效地运行,因为 Spark 可以从端到端优化整个数据流。

Action

为了触发计算,需要运行一个 action 操作。action 操作使 Spark 通过执行一系列 transformation 转换,得出计算结果。最简单的 action 操作是 count,它给出了DataFrame 中记录的总数。

divisBy2.count()

Action 有三种类型:

  1. 在控制台中查看数据的 action;
  2. 数据收集的 action 操作;
  3. 输出到第三方存储系统的 action 操作。

在执行这个 count 操作时,启动了一个 sparkJob,运行过滤器 where 转换(一个窄依赖转换),然后是一个聚合(一个款依赖转换),它在每个分区基础上执行计数,然后是一个收集 action,它将我们的结果到 driver 端。通过检查SparkUI,可以看到这一切。

注册为表或视图

可以通过一个简单的方法调用将任何 DataFrame 转换为一个表或视图:

myData.createOrReplaceTempView("myData”);

现在我们可以通过使用 SQL来查询我们的数据了。使用spark.sql函数,这里是返回一个新的 DataFrame。

DataFrame 概念

  1. DataFrame 是从 Spark1.3 开始引入了一个名为 DataFrame 的表格式数据抽象;
  2. DataFrame 是用于处理结构化和半结构化数据的数据抽象;
  3. DataFrame 利用其 Schema 以比原始 RDDs 更有效的方式存储数据;
  4. DataFrame 利用 RDD 的不可变性、内存计算、弹性的、分布式的和并行的特性,变成数据应用一个成为 schema 的数据结构,允许 spark 管理 schema, 以比 java序列化更有效的方法在集群节点之间进行数据的传递。
  5. 与 RDD 不同,DataFrame 中的数据被组织到指定的 columns 中,就像噶UN系数据库中的表一样。

Dataset 概念

  1. 面向对象的编程风格;
  2. 像 RDD API 一样的编译时类型安全;
  3. 利用 schema 处理结构化数据的优势;
  4. Dataset 是结构化数据集,数据集泛型可以是 Row (DataFrame),也可以是特定的数据类型;
  5. Java 和 Spark 在编译时将知道数据集中数据的类型。

DataFrame 和 Dataset 对比

  1. DataFrame API 与 Dataset API 合并;
  2. Dataset 提供了 两个截然不同的 API特性:强类型 API(strong typed API),未定义类型 API(untyped API);
  3. 可以将 DataFrame 看做是 Dataset 的 untyped 类型:Dataset,Row 是一个 untyped 的 JVM 对象;
  4. Dataset 是强类型 JVM 对象的集合。

猜你喜欢

转载自blog.csdn.net/dec_sun/article/details/89434388