前言:
💞💞大家好,我是书生♡,本阶段和大家一起分享和探索大数据技术Spark—SparkSQL,本篇文章主要讲述了:Spark SQL 介绍,DataFrame 的 Row 和 Schema,DataFrame 的创建与基本使用等等。欢迎大家一起探索讨论!!!
💞💞代码是你的画笔,创新是你的画布,用它们绘出属于你的精彩世界,不断挑战,无限可能!
个人主页⭐: 书生♡
gitee主页🙋♂:闲客
专栏主页💞:大数据开发
博客领域💥:大数据开发,java编程,前端,算法,Python
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬
1. SparkSQL介绍
Spark SQL 是 Apache Spark 中的一个模块,它为处理结构化和半结构化数据提供了一种高效且易用的方法。Spark SQL 允许用户通过 SQL 查询或通过 DataFrame 和 Dataset API 来处理数据。
定义:
- SparkSQL是处理结构化数据的模块/组件
- 结构化数据 -> 可以用schema描述的数据
- 表格, 行列数据
- DataFrame
- DataSet
- SparkSQL比Spark Core操作起来更加便捷, 提供更多高级API
特点
- 融合性
- 通过SQL语言和spark一起使用, SparkSQL还提供了DSL方式(将SQL的关键字以面向对象的编程思想使用)
- 统一数据访问
- 通过read方法读取各种数据源的数据, HDFS/MySQL/Redis/Hbase/Kafka/ElasticSearch/文件
- 通过write方法将计算结果保存到各种数据源, HDFS/MySQL/Redis/Hbase/Kafka/ElasticSearch/文件
- 标准数据连接
- 各种工具通过odbc和jdbc方式连接SparkSQL
- 兼容hive
- 使用HiveSQL的方法
- 读写Hive数据表数据
1.1 Spark SQL 的核心概念
-
DataFrame:
- DataFrame 是 Spark SQL 中的一个分布式数据集,它是一个由行和列组成的二维表格。
- DataFrame 可以被看作是一个不可变的表格,其中每一列都是某种类型的值。
- DataFrame API 提供了丰富的操作,包括选择、过滤、分组、聚合等。
-
Dataset:
- Dataset 是 DataFrame 的一个扩展,它支持强类型和编译时类型检查。
- Dataset API 提供了类似于 DataFrame 的操作,但同时也支持更强大的类型安全性和表达能力。
-
Row:
- Row 是 DataFrame 中单行数据的表示形式,它提供了按列名访问数据的能力。
- Row 类似于一个不可变的 JavaBean 对象,可以通过字段名访问数据。
-
Schema:
- Schema 描述了 DataFrame 的结构,包括每一列的名称和数据类型。
- Schema 是 DataFrame 的元数据,它确保了数据的一致性和正确处理。
1.2 Spark SQL 的主要特性
-
SQL 查询:
- Spark SQL 支持使用标准 SQL 语法查询数据。
- 可以注册 DataFrame 作为临时视图,然后使用 SQL 查询这些视图。
-
自动类型推断:
- 当从外部数据源加载数据时,Spark SQL 可以自动推断数据的模式和类型。
- 用户也可以手动指定数据模式。
-
数据源 API:
- Spark SQL 提供了一个统一的 API 来读取和写入各种数据源,包括 CSV、JSON、Parquet、Avro、JDBC 等。
-
性能优化:
- Spark SQL 使用 Catalyst 优化器来自动优化查询计划,提高执行效率。
- 支持多种优化策略,如列式存储、缓存等。
-
交互式查询:
- Spark SQL 可以在 Spark 的交互式环境中使用,如 Spark Shell 或 Jupyter Notebook。
- 支持实时查询和结果反馈。
1.3 SparkSQL和HiveSQL对比
-
HiveSQL
- Hive工具对HDFS文件数据映射成数据表, 同时提供了SQL编程方式
- Hive的metastore服务管理表的元数据
- Hive借助MapReduce计算引擎进行计算
-
Spark on Hive
- SparkSQL只是用于处理结构化数据的计算引擎, 不存储数据, 所以表的元数据借助于Hive的metastore服务存储
- SparkSQL借助catalyst引擎将SparkSQL转成Spark RDD进行计算
- SparkSQL提供了SQL和DSL两种编程方式
1.4 数据类型
- RDD
- 弹性分布式数据集合
- 可以存储任意结构数据 [], [[],[],[]], [[[],[]],[[],[]]] (存储二维的)
- 只存储数据值
- DataFrame
- 弹性分布式数据集合
- 只存储结构化数据
- DF由row对象和schema对象组成的
- row对象 -> 一行数据/RDD一个列表
- schema对象 -> 表的元数据(表名/字段名/字段类型)
- DataSet
- java和scala编程语言中特有的数据类型
- DataSet中一行数据就是一个DataFrame类型
Spark SQL 是一个强大的工具,它结合了 SQL 查询的易用性和 DataFrame API 的灵活性。通过 Spark SQL,开发者可以轻松地处理结构化和半结构化数据,执行复杂的查询和数据处理任务,同时保持较高的性能和效率。无论是用于数据科学项目还是生产环境中的数据处理,Spark SQL 都是一个值得信赖的选择。

2. DataFrame的row对象和schema对象操作
在 Apache Spark 中,DataFrame 是一个分布式的、不可变的、带有 Schema 的数据集。DataFrame 可以被视为表格数据的一种表示,其中每一行是一个 Row 对象,每一列都有明确的数据类型。Row 对象和 Schema 对象是 DataFrame 的两个重要组成部分。
- Row 对象
Row 对象代表 DataFrame 中的一行数据。它是一个不可变的对象,提供了两种主要的方式来访问数据:通过索引和通过列名。 - Schema 对象
Schema 对象描述了 DataFrame 的结构,即每一列的名称和数据类型。Schema 是 DataFrame 的元数据,对于确保数据的一致性和正确处理至关重要。
2.1 ROW对象
我们的row对象是来自类,来自于pyspark.sql
# dataframe是由row对象和schema对象组成
# 导入row对象的类
from pyspark.sql import Row
创建一个ROW对象,一行数据就是一个ROW对象
对象名= 类名属性值()
row1 = Row(name='小明', age=18, gender='男') #指定了列名
row2 = Row('小红', 16, '女')
查看row数据
row1 = Row(name='小明', age=18, gender='男')
row2 = Row('小红', 16, '女')
print(row1)
print(row2)
print(type(row1))
print(type(row2))

可以发现我们在创建ROW对象的时候,指定列名和不指定,输出数据的格式是有差异的!!!
建议:如果要创建ROW对象的话,使用第一种方法。加上列名会更清晰
获取ROW对象的属性值
获取属性的方式,跟我们的python差不多,可以根据下标,和属性名去获取对应的值
对象名.属性名对象名['属性名']对象名[下标]
# 对象名.属性名
print(row1.name)
print(row1.age)
# 对象名[属性名]
print(row1['gender'])
print(row1[0])
print(row1[1])
print(row1[2])
print("////////////////////////////////////////////////////////")
# 对象名[下标]
print(row2[0])
print(row2[1])
print(row2[2])
注意:第一种创建方式我们可以通过属性名获取对应的值,但是第二种方式没有属性名,那么就只能通过下标进行获取对应下标的值。
2.2 schema对象
我们需要导入schema对象的各种数据类型类
# 导入schema对象的各种数据类型类
from pyspark.sql.types import *
- StructType()类创建schema对象调用add方法 创建Schema
创建schema对象 表结构->字段名,字段类型
对象名=类名(属性值) 通过StructType()类创建schema对象,
调用add方法添加字段名/字段类型/是否允许为空(默认True)
StringType()->字符串类型的类
IntegerType()->整数类型的类
nullable ->决定是否可以为空
schema1 = (StructType().
add(field='name', data_type=StringType(), nullable=True).
add('age', IntegerType(), nullable=False).
add('gender', StringType()))
我们可以通过下标来获取对应的类名
print(schema1)
print(type(schema1))
# 获取对象属性
# 获取第一个字段信息
print(schema1[0])
print(schema1[1])
print(schema1[2])

- 通过list创建schema对象
scheme3 = StructType(fields=[StructField('name',StringType(),True),
StructField('age',IntegerType(),False),
StructField('gender',StringType())])

3. DataFrame的创建
DataFrame是由SparkSession类的对象提供的方法进行创建
SparkSession就是df的入口类, SparkSession在SparkContext类基础进行进一步封装
3.1 DataFrame的创建方式
在 Apache Spark 中,DataFrame 是一种非常重要的数据结构,它是一个分布式的、不可变的表格型数据集,具有明确的
Schema。DataFrame 可以通过多种方式创建
- 从 RDD 创建 DataFrame
如果已经有了一个 RDD,可以使用 toDF() 方法将其转换为 DataFrame。需要注意的是,如果 RDD 中的元素是一个 tuple,那么 Spark 会自动推断出列名;如果需要指定列名,则可以在调用 toDF() 方法时传入列名列表。
示例代码
from pyspark.sql import SparkSession
# 创建 SparkSession
spark = SparkSession.builder \
.appName("DataFrame Creation") \
.getOrCreate()
# 创建一个 RDD
data_rdd = spark.sparkContext.parallelize([
("Alice", 25, "NY"),
("Bob", 30, "LA"),
("Charlie", 22, "Chicago")
])
# 从 RDD 创建 DataFrame
df_from_rdd = data_rdd.toDF(["name", "age", "city"])
# 显示 DataFrame
df_from_rdd.show()
- 从外部数据源创建 DataFrame
Spark 支持从多种外部数据源创建 DataFrame,包括 CSV、JSON、Parquet、Avro 等格式的文件。
示例代码
# 从 CSV 文件创建 DataFrame
df_from_csv = spark.read.format("csv"

最低0.47元/天 解锁文章
1068

被折叠的 条评论
为什么被折叠?



