【Spark计算引擎----第四篇(SparkSQL)---《Spark SQL 介绍:DataFrame 的 Row 和 Schema,DataFrame 的创建与基本使用》】

前言:
💞💞大家好,我是书生♡,本阶段和大家一起分享和探索大数据技术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 的核心概念

  1. DataFrame:

    • DataFrame 是 Spark SQL 中的一个分布式数据集,它是一个由行和列组成的二维表格。
    • DataFrame 可以被看作是一个不可变的表格,其中每一列都是某种类型的值。
    • DataFrame API 提供了丰富的操作,包括选择、过滤、分组、聚合等。
  2. Dataset:

    • Dataset 是 DataFrame 的一个扩展,它支持强类型和编译时类型检查。
    • Dataset API 提供了类似于 DataFrame 的操作,但同时也支持更强大的类型安全性和表达能力。
  3. Row:

    • Row 是 DataFrame 中单行数据的表示形式,它提供了按列名访问数据的能力。
    • Row 类似于一个不可变的 JavaBean 对象,可以通过字段名访问数据。
  4. Schema:

    • Schema 描述了 DataFrame 的结构,包括每一列的名称和数据类型。
    • Schema 是 DataFrame 的元数据,它确保了数据的一致性和正确处理。

1.2 Spark SQL 的主要特性

  1. SQL 查询:

    • Spark SQL 支持使用标准 SQL 语法查询数据。
    • 可以注册 DataFrame 作为临时视图,然后使用 SQL 查询这些视图。
  2. 自动类型推断:

    • 当从外部数据源加载数据时,Spark SQL 可以自动推断数据的模式和类型。
    • 用户也可以手动指定数据模式。
  3. 数据源 API:

    • Spark SQL 提供了一个统一的 API 来读取和写入各种数据源,包括 CSV、JSON、Parquet、Avro、JDBC 等。
  4. 性能优化:

    • Spark SQL 使用 Catalyst 优化器来自动优化查询计划,提高执行效率。
    • 支持多种优化策略,如列式存储、缓存等。
  5. 交互式查询:

    • 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"
### 错误原因分析 在使用 `spark.createDataFrame(pandas_df)` 方法时,出现错误信息 `'DataFrame' object has no attribute 'iteritems'` 的原因是由于 Spark 内部调用了 Pandas 的 `iteritems()` 方法[^1]。然而,在较新的 Pandas 版本中,`iteritems()` 方法已被弃用并移除,导致此方法不可用,从而引发 `AttributeError`[^2]。 ### 解决方案 以下是针对该问题的几种解决方法,可根据实际需求选择: #### 1. 降低 Pandas 版本 通过安装一个较低版本的 Pandas(例如 1.5.3),可以确保 `iteritems()` 方法仍然可用。具体操作如下: ```bash pip uninstall pandas pip install pandas==1.5.3 -i https://pypi.tuna.tsinghua.edu.cn/simple ``` 这种方法简单直接,适用于对 Pandas 新功能依赖较少的场景。 #### 2. 替换 `iteritems()` 方法 如果不想降低 Pandas 版本,可以通过重新定义 `iteritems()` 方法为 `items()` 来兼容 Spark 的需求。代码示例如下: ```python import pandas as pd # 兼容 iteritems() 方法 pd.DataFrame.iteritems = pd.DataFrame.items # 创建 Spark DataFrame df = spark.createDataFrame(pandas_df) ``` 这种方法无需更改 Pandas 版本,适合需要使用最新 Pandas 功能的场景[^3]。 #### 3. 升级 Spark 版本 如果当前使用Spark 版本较旧,可能未适配最新的 Pandas 版本。升级到最新版本的 Spark 可以解决此问题,因为新版本通常会修复 Pandas 兼容性相关的问题。下载链接可参考官方资源:[Spark 下载页面](https://spark.apache.org/downloads.html)[^3]。 #### 4. 使用其他转换方式 作为替代方案,可以直接将 Pandas DataFrame 转换为字典或其他数据结构后再创建 Spark DataFrame。例如: ```python data_dict = pandas_df.to_dict(orient='records') df = spark.createDataFrame(data_dict) ``` 这种方法绕过了 `iteritems()` 的调用,但可能会增加一定的内存开销[^3]。 ### 示例代码 以下是一个完整的代码示例,展示了如何通过替换 `iteritems()` 方法解决问题: ```python import pandas as pd from pyspark.sql import SparkSession # 初始化 SparkSession spark = SparkSession.builder.appName("example").getOrCreate() # 创建 Pandas DataFrame pandas_df = pd.DataFrame({ 'A': [1, 2, 3], 'B': ['a', 'b', 'c'] }) # 兼容 iteritems() 方法 pd.DataFrame.iteritems = pd.DataFrame.items # 创建 Spark DataFrame df = spark.createDataFrame(pandas_df) df.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值