Spark_06_sparksql
Enoch

一、 SparkSQL 介绍

SparkSQL 是Spark 用来处理结构化数据的一个模块,可以通过SQL的方式访问和处理数据。它提供了一个叫做DataFrame的编程抽象结构数据模型,可以简单理解为 DataFrame = rdd + schema信息。SparkSQL底层有一个SQL的查询引擎,帮助用户将SQL翻译成底层的RDD编程模型,从而执行任务。

SparkSQL 前身是shark,但是shark过度依赖hive,导致很多方面无法进一步优化。

SparkSQL的特点:

  1. 多数据源支持

    比如 json、csv、jdbc、hive等等结构化数据源都可以支持,包括数据的读和写以及数据分析

  2. 无缝集成RDD

    SparkSQL虽然编程对象是DataFrame,但是他能够很轻松的转换为RDD。RDD也可以通过附加schema来转换为DataFrame。

二、 SparkSQL 编程模型

Spark SQL使用的数据抽象并非是RDD,而是DataFrame。在Spark1.3.0版本之前,DataFrame被称为 SchemaRDD。DataFrame使Spark具备了处理大規模结构化数据的能力。在Spark中,DataFrame是一种以RDD 为基础的分布式数据集,因此DataFrame可以完成RDD的绝大多数功能,在开发使用时,也可以调用方法将RDD 和DataFrame进行相互转换。DataFrame的结构类似于传统数据库的二维表格,并且可以从很多数据源中创建, 如结构化文件、外部数据库、Hive表等数据源。DataFrame与RDD在结构上的区别如下所示。

image-20250322145823260

RDD是分布式的Java对象的集合,如上图所示的RDD[Person]数据集,虽然它以Person为类型参数,但是对象内部 之间的结构相对于Spark框架本身是无法得知的,这样在转换数据形式时效率相对较低。DataFrame除了提供比RDD更丰富的算子以外,更重要的特点是提升Spark框架执行效率、减少数据读 取时间以及优化执行计划。有了DataFrame这个更高层次的抽象后,处理数据就更加简单了,甚至可以直接用SQL来 处理数据,这对于开发者来说,易用性有了很大的提升。

SparkSQL 程序的入口不再是 SparkContext,而是SparkSession,SparkSession是在sparkcontext的基础上进一步封装,换句话说,sparkSession持有sparkContext并且还有其他功能。

DataFrame和dataset的关系

1
type DataFrame = Dataset[Row]

可以认为,Spark中的DataFrame就是特殊的dataset(类型为Row的dataset)。

Dataset是类型安全的(或者说Dataset是强类型的),而DataFrame则是早期只有类型为Row的一种数据结构,后续被Dataset取代。

1. 创建DataFrame的方式

  1. 通过自定义schema结构来创建一个DataFrame
  2. 通过实体类创建DataFrame
  3. 通过外部文件创建DataFrame
  4. 通过jdbc读取数据库的表(外部连接器)(MongoDB、es https://spark.apache.org/third-party-projects.html)

2. 对DataFrame做操作

有两种方式可以对DataFrame进行操作,一种叫 DSL(domain spec language),一种叫SQL。通常来说,我们习惯直接使用SQL的方式进行操作,DSL比较少用。

具体用法参考代码。

3. 输出

  1. 输出到控制台(show、collect+print)
  2. 保存到文件
  3. 保存到外部连接(jdbc、hive)

4. rdd和DataFrame相互转换

1
2
RDD<Row> rdd = dataframeFromJdbc.rdd();
Dataset<Row> dataFrame2 = spark.createDataFrame(rdd, schema);
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量