spark-sql学习内容总结

SparkSession

定义与功能 ‌:SparkSession是Spark SQL的入口,封装SparkContext,提供了创建DataFrame和执行SQL的能力。它实质上是SQLContext和HiveContext的组合,因此兼容这两者的API。

创建方式 ‌:在使用spark-shell时,Spark会自动创建一个名为spark的SparkSession对象。在程序中,可以通过SparkSession.builder().appName("AppName").getOrCreate()方法创建。DataFrame 的创建与操作

创建方式 ‌:

从数据源创建 ‌:支持从多种数据源(如JSON、Parquet、JDBC等)读取数据并创建DataFrame。

RDD 转换 ‌:可以通过调用RDD的toDF()方法,并指定schema信息,将RDD转换为DataFrame。

Hive 表查询 ‌:在HiveContext下,可以通过SQL查询Hive表并返回DataFrame。

操作 ‌:DataFrame API提供了丰富的transformation和action操作,允许用户对数据进行各种转换和查询。

SQL 语法与视图

临时视图与全局视图 ‌:

临时视图 ‌:通过DataFrame的createOrReplaceTempView()方法创建,只在当前SparkSession中有效。

全局视图 ‌:通过createGlobalTempView()方法创建,在所有SparkSession中共享,但需要在配置文件中指定Hive相关信息。

SQL 查询 ‌:在创建了视图后,可以使用SparkSession的sql()方法执行SQL查询,并返回查询结果的DataFrame。

数据类型与兼容性

数据类型 ‌:Spark SQL支持多种数据类型,包括基本数据类型(如Int、String等)和复杂数据类型(如Struct、Array、Map等)。

兼容性 ‌:Spark SQL不仅兼容Hive,还支持从RDD、Parquet文件、JSON文件等多种数据源获取数据,未来版本甚至支持获取RDBMS数据以及Cassandra等NOSQL数据。

总结

Spark-SQL核心编程涉及SparkSession的创建与使用、DataFrame的创建与操作、SQL语法与视图的应用以及数据类型与兼容性等多个方面。通过掌握这些核心知识点,开发人员可以更加高效地使用Spark SQL进行数据处理和查询。

DataFrame DSL 语法

Spark SQL 的 DataFrame 提供了一个特定领域语言(DSL)来管理结构化的数据。在 Scala、Java、Python 和 R 中均可使用此 DSL,无需创建临时视图即可进行数据操作。

创建 DataFrame

使用 spark.read 方法从多种数据源(如 JSON 文件)创建 DataFrame。

查看 DataFrame 信息

printSchema:查看 DataFrame 的 schema 信息。

show:展示 DataFrame 中的数据。

数据选择

select:通过列名或列表达式选择数据。可以使用 $ 符号或单引号表达式来引用列。

数据过滤

filter:根据条件过滤数据。

数据分组与聚合

groupBy:按指定列分组。

count:统计分组后的数据条数。

RDD DataFrame 之间的转换

RDD 转换为 DataFrame

在 IDEA 中开发时,需要引入 import spark.implicits._。

可以使用 toDF 方法将 RDD 转换为 DataFrame,通常需要先定义一个样例类来表示数据结构。

DataFrame 转换为 RDD

DataFrame 是对 RDD 的封装,可以直接调用 rdd 方法获取内部的 RDD。

转换后的 RDD 存储类型为 Row,可以通过 getAs 方法获取特定列的数据。

使用场景与优势

使用场景 ‌:适用于需要对结构化数据进行高效查询和处理的场景,如数据分析、数据清洗等。

优势 ‌:

易用性 ‌:DataFrame API 提供了简洁且强大的数据操作能力,降低了开发难度。

性能优化 ‌:Spark SQL 的优化执行引擎能够自动进行多种优化作,提高查询性能。

兼容性 ‌:兼容 Hive,可以在已有的 Hive 仓库上直接运行 SQL 或 HQL。

定义 ‌:DataSet是具有强类型的数据集合,需要提供对应的类型信息。它是Spark 1.6版本中引入的一个新的数据抽象,旨在提供比RDD更高层次的抽象和更多的优化机会。

特点 ‌:DataSet与RDD和DataFrame共享许多共性,如惰性执行、自动缓存、分区等。但DataSet的每一行都有具体的类型,这提供了比DataFrame更丰富的类型信息和更强的类型安全性。

DataSet 的创建与操作

创建方式 ‌:

使用样例类序列创建 ‌:通过定义样例类,并使用Seq的toDS()方法将序列转换为DataSet。

使用基本类型的序列创建 ‌:虽然不常见,但也可以将基本类型的序列(如SeqInt])转换为DataSet。

RDD 转换 ‌:SparkSQL能够自动将包含有case类的RDD转换成DataSet。

操作 ‌:DataSet API提供了与DataFrame相似的transformation和action操作,但由于DataSet具有强类型,因此在进行操作时可以获得更好的类型检查和编译时错误提示。

DataFrame DataSet 的转换与关系

转换 ‌:

DataFrame 转换为 DataSet ‌:通过调用DataFrame的asT]()方法,可以将DataFrame转换为特定类型的DataSet。

DataSet 转换为 DataFrame ‌:通过调用DataSet的toDF()方法,可以将DataSet转换回DataFrame。

关系 ‌:

共性 ‌:DataFrame和DataSet都是Spark平台下的分布式弹性数据集,它们共享许多共性,如惰性执行、自动缓存、分区等。同时,它们也都支持Spark SQL的操作,如select、groupby等。

区别 ‌:主要区别在于每一行的数据类型。DataFrame的每一行是Row类型,而DataSet的每一行是用户自定义的类型(通常是case类)。因此,DataSet提供了比DataFrame更丰富的类型信息和更强的类型安全性。

RDD DataFrame DataSet 三者的对比与选择

对比 ‌:

RDD ‌:提供了低级别的抽象,允许用户以任意方式操作数据。但由于缺乏类型信息,RDD的API相对较为繁琐,且容易出错。

DataFrame ‌:提供了高级别的抽象,以Row和Schema的形式组织数据。虽然比RDD更易于使用,但仍然缺乏类型安全性。

DataSet ‌:结合了RDD的低级别操作和DataFrame的高级别抽象,同时提供了类型安全性。是处理结构化数据的首选方式。

选择 ‌:

在处理结构化数据时,应优先考虑使用DataSet。因为它提供了类型安全性,并且API更加简洁易用。

在需要低级别操作或处理非结构化数据时,可以考虑使用RDD。

DataFrame可以作为DataSet的特例(即DatasetRow])来使用,但在需要类型安全性时应转换为DataSet。

总结

Spark-SQL核心编程(三)主要涉及DataSet的创建与操作、DataFrame与DataSet的转换与关系以及RDD、DataFrame、DataSet三者的对比与选择。通过掌握这些核心知识点,开发人员可以更加高效地使用Spark SQL进行结构化数据的处理和查询。

相关推荐
我要学习别拦我~1 小时前
Kaggle项目:一次 Uber 出行数据分析的完整思路
大数据·经验分享·数据分析
一枚小小程序员哈1 小时前
大数据、hadoop、爬虫、spark项目开发设计之基于数据挖掘的交通流量分析研究
大数据·hadoop·爬虫
TDengine (老段)2 小时前
TDengine IDMP 运维指南(管理策略)
大数据·数据库·物联网·ai·时序数据库·tdengine·涛思数据
哆啦A梦是一只狸猫2 小时前
SQL Server缩小日志文件.ldf的方法(适用于开发环境)
数据库·sql·sqlserver
数据智能老司机4 小时前
Snowflake 快速入门——使用 Snowpipe 与动态表实现持续数据加载
大数据·数据分析·saas
数据智能老司机4 小时前
Snowflake 快速入门——Snowflake 管理与 RBAC
大数据·数据分析·saas
数据智能老司机4 小时前
Snowflake 快速入门——快速上手云分析
大数据·数据分析·saas
武子康5 小时前
大数据-77 Kafka 延时队列与消息重试机制全解析:从原理到实战落地 Java
大数据·后端·kafka
攻城狮7号6 小时前
以国产IoTDB为代表的主流时序数据库架构与性能深度选型评测
大数据·物联网·时序数据库·apache iotdb·sql mcp
烟锁池塘柳09 小时前
【R语言】R语言中 rbind() 与 merge() 的区别详解
sql·r语言