Spark 中创建 DataFrame 的2种方式对比

spark.createDataFrame(data).toDF("name", "age")

spark.createDataFrame(spark.sparkContext.parallelize(data), schema)

创建df的方式有什么区别?

在 Spark 中,创建 DataFrame 的方式有多种,其中两种常见的方式是:

  1. spark.createDataFrame(data).toDF("name", "age")

  2. spark.createDataFrame(spark.sparkContext.parallelize(data), schema)

这两种方式的主要区别在于 数据来源 和 模式(Schema)的定义方式。下面详细分析它们的区别和适用场景。


1. spark.createDataFrame(data).toDF("name", "age")

特点
  • 数据来源data 是一个本地集合(如 Seq 或 List),Spark 会将其并行化为分布式数据集(RDD)。

  • 模式推断:Spark 会自动推断数据的模式(Schema),并根据列的顺序为列命名。

  • 列名指定:通过 toDF("name", "age") 显式指定列名。

示例
import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("DataFrame Example").master("local[*]").getOrCreate()// 数据是一个本地集合
val data = Seq(("Alice", 25), ("Bob", 30), ("Charlie", 35))// 创建 DataFrame,并指定列名
val df = spark.createDataFrame(data).toDF("name", "age")df.show()

输出:

+-------+---+
|   name|age|
+-------+---+
|  Alice| 25|
|    Bob| 30|
|Charlie| 35|
+-------+---+
适用场景
  • 数据量较小,可以直接在本地集合中定义。

  • 不需要显式定义复杂的模式(Schema)。

  • 列名可以通过 toDF 简单指定。


2. spark.createDataFrame(spark.sparkContext.parallelize(data), schema)

特点
  • 数据来源data 是一个本地集合,通过 spark.sparkContext.parallelize(data) 将其显式转换为 RDD。

  • 模式定义:需要显式定义一个模式(StructType),指定每列的名称和数据类型。

  • 灵活性:适合处理复杂的数据结构(如嵌套结构体)。

示例
import org.apache.spark.sql.{SparkSession, Row}
import org.apache.spark.sql.types._val spark = SparkSession.builder().appName("DataFrame Example").master("local[*]").getOrCreate()// 数据是一个本地集合,每个元素是一个 Row 对象
val data = Seq(Row("Alice", 25),Row("Bob", 30),Row("Charlie", 35)
)// 定义模式
val schema = new StructType().add(StructField("name", StringType, nullable = false)).add(StructField("age", IntegerType, nullable = false))// 创建 DataFrame
val df = spark.createDataFrame(spark.sparkContext.parallelize(data), schema)df.show()

输出:

+-------+---+
|   name|age|
+-------+---+
|  Alice| 25|
|    Bob| 30|
|Charlie| 35|
+-------+---+
适用场景
  • 数据量较大,需要显式并行化为 RDD。

  • 数据结构复杂,需要显式定义模式(Schema)。

  • 需要更精确地控制列的数据类型和是否允许为空。


3. 主要区别

特性spark.createDataFrame(data).toDF("name", "age")spark.createDataFrame(spark.sparkContext.parallelize(data), schema)
数据来源本地集合(自动并行化为 RDD)本地集合(显式并行化为 RDD)
模式定义自动推断模式需要显式定义模式(StructType
列名指定通过 toDF 指定列名在模式中定义列名
数据类型控制自动推断数据类型可以显式指定每列的数据类型
是否允许为空默认允许为空可以显式指定是否允许为空
适用场景简单数据结构,数据量较小复杂数据结构,数据量较大

4. 选择哪种方式?

  • 使用 spark.createDataFrame(data).toDF("name", "age") 的情况

    • 数据量较小,可以直接在本地集合中定义。

    • 数据结构简单,不需要显式定义模式。

    • 列名可以通过 toDF 简单指定。

  • 使用 spark.createDataFrame(spark.sparkContext.parallelize(data), schema) 的情况

    • 数据量较大,需要显式并行化为 RDD。

    • 数据结构复杂,需要显式定义模式。

    • 需要精确控制列的数据类型和是否允许为空。


5. 复杂数据结构示例

如果需要处理嵌套结构体(如数组或结构体),推荐使用显式定义模式的方式。

示例:嵌套结构体
import org.apache.spark.sql.{SparkSession, Row}
import org.apache.spark.sql.types._val spark = SparkSession.builder().appName("Nested DataFrame Example").master("local[*]").getOrCreate()// 数据是一个本地集合,包含嵌套结构
val data = Seq(Row("Alice", Row("Java", 5)),Row("Bob", Row("Python", 4))
)// 定义模式
val schema = new StructType().add(StructField("name", StringType, nullable = false)).add(StructField("skill", new StructType().add(StructField("name", StringType, nullable = false)).add(StructField("level", IntegerType, nullable = false))))// 创建 DataFrame
val df = spark.createDataFrame(spark.sparkContext.parallelize(data), schema)df.printSchema()
df.show()

输出:

root|-- name: string (nullable = false)|-- skill: struct (nullable = false)|    |-- name: string (nullable = false)|    |-- level: integer (nullable = false)+-----+----------+
| name|     skill|
+-----+----------+
|Alice| [Java, 5]|
|  Bob|[Python, 4]|
+-----+----------+

总结

  • spark.createDataFrame(data).toDF("name", "age"):适合简单场景,自动推断模式。

  • spark.createDataFrame(spark.sparkContext.parallelize(data), schema):适合复杂场景,显式定义模式。

根据数据结构和需求选择合适的方式即可!如果还有其他问题,欢迎继续提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六十天前端强化训练之第十七天React Hooks 入门:useState 深度解析

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、知识讲解 1. Hooks 是什么? 2. useState 的作用 3. 基本语法解析 4. 工作原理 5. 参数详解 a) 初始值设置方式 b) 更新函数特性 6. 注意事项 7. 类组…

IEC61850标准下MMS 缓存报告控制块 ResvTms详细解析

IEC61850标准是电力系统自动化领域唯一的全球通用标准。IEC61850通过标准的实现,使得智能变电站的工程实施变得规范、统一和透明,这大大提高了变电站自动化系统的技术水平和安全稳定运行水平。 在 IEC61850 标准体系中,ResvTms(r…

【JVM】GC 常见问题

GC 常见问题 哪些情况新生代会进入老年代 新生代 GC 后幸存区(survivor)不够存放存活下来的对象,会通过内存担保机制晋升到老年代。大对象直接进入老年代,因为大对象再新生代之间来会复制会影响 GC 性能。由 -XX:PretenureSizeT…

Audacity 技术浅析(一)

Audacity 是一个开源的音频编辑工具,虽然它主要用于音频编辑和处理,但也可以通过一些插件和功能实现基本的音频生成功能。 1. Audacity 的音频生成基础 Audacity 的音频生成主要依赖于其内置的生成器、效果器以及 Nyquist 编程语言。这些工具允许用户创…

G-Star 公益行起航,挥动开源技术点亮公益!

公益组织,一直是社会温暖的传递者,但在数字化浪潮中,也面临着诸多比大众想象中复杂的挑战:项目管理如何更高效?志愿者管理又该如何创新?宣传推广怎么才能更有影响力?内部管理和技术支持又该如何…

MongoDB 数据导出与导入实战指南(附完整命令)

1. 场景说明 在 MongoDB 运维中,数据备份与恢复是核心操作。本文使用 mongodump 和 mongorestore 工具,演示如何通过命令行导出和导入数据,解决副本集连接、路径指定等关键问题。 2. 数据导出(mongodump) 2.1 导出命…

京东 h5st 5.1 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 学习了2天某物,f…

CentOS 系统安装 docker 以及常用插件

博主用的的是WindTerm软件链接的服务器,因为好用 1.链接上服务器登入后,在/root/目录下 2.执行以下命令安装docker sudo yum install -y yum-utilssudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.reposudo…

不像人做的题————十四届蓝桥杯省赛真题解析(上)A,B,C,D题解析

题目A:日期统计 思路分析: 本题的题目比较繁琐,我们采用暴力加DFS剪枝的方式去做,我们在DFS中按照8位日期的每一个位的要求进行初步剪枝找出所有的八位子串,但是还是会存在19月的情况,为此还需要在CHECK函数…

【redis】set 类型:基本命令

文章目录 基本概念SADD 和 SMEMBERSSCARDSPOPSRANDMEMBERSMOVESREM集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 命令小结内部编码 基本概念 谈到一个属于,这个术语可能有多种含义,set 集合设置(和 get 相对应&#xff09…

C 语言进【进阶篇】之动态内存管理:从底层机制到实战优化

目录 🚀前言🌟动态内存分配的必要性🤔动态内存分配函数深度剖析💯malloc函数:内存申请的主力军💯free函数:释放内存的“清道夫”💯calloc函数:初始化内存的利器&#x1f…

2023华东师范大学计算机复试上机真题

2023华东师范大学计算机复试上机真题 2022华东师范大学计算机复试上机真题 2021华东师范大学计算机复试上机真题 2023华东师范大学计算机复试机试真题 2022华东师范大学计算机复试机试真题 2021华东师范大学计算机复试机试真题 在线评测:传送门:pgcode.…

Mac下安装Zed以及Zed对MCP(模型上下文协议)的支持

Zed是当前新流行的一种编辑器,支持MCP(模型上下文协议) Mac下安装Zed比较简单,直接有安装包,在这里: brew install --cask zedMac Monterey下是可以安装上的,亲测有效。 配置 使用CtrlShiftP…

Spring Boot 约定大于配置:实现自定义配置

文章目录 Spring Boot 约定大于配置:实现自定义配置引言1. Spring Boot 的约定大于配置2. 自定义配置的需求3. 实现自定义配置的步骤4. 示例:自定义 Spring MVC 配置4.1 创建自定义配置类4.2 创建自定义拦截器4.3 测试自定义配置 5. 其他自定义配置场景5…

交易系统优化方案

证券交易系统优化方案 一、选股策略体系 (一)择时策略矩阵 尾盘集中筛选法(14:30后)聚焦量价异动个股,捕捉次日溢价机会早盘转债套利法(9:25-10:00)通过可转债与正股联动性捕捉日内机会龙头战法(全时段)行业板块强度排序,锁定前三大市值龙头容量资金战法(中盘股适用…

在线Doc/Docx转换为PDF格式 超快速转换的一款办公软件 文档快速转换 在线转换免费转换办公软件

小白工具https://www.xiaobaitool.net/files/word-pdf/提供了一项非常实用的在线服务——将Doc或Docx格式的文档快速转换为PDF格式。这项服务不仅操作简单,而且转换效率高,非常适合需要频繁处理文档转换的用户。 服务特点: 批量转换&#x…

java学习总结(四)MyBatis多表

一、多表结构 学生表、班级表、课程表、班级课程表 二、一对一 一个学生只属于一个班级。 查询:id name age gender banjiName SELECT s.id,s.name,s.age,s.gender,b.id AS banjiId,b.name AS banjiName FROM student AS s INNER JOIN banji AS b ON s.banji_id…

大语言模型学习及复习笔记(1)语言模型的发展历程

1.大模型进入人们视野 ChatGPT 于2022年11月底上线 模型名称 发布时间 核心突破 GPT-3 2020年6月 首款千亿参数模型,少样本学习 GPT-3.5-Turbo 2022年11月 对话能力优化,用户级应用落地 GPT-4 2023年3月 多模态、强逻辑推理 GPT-4o / GPT-4…

【NLP】 3. Distributional Similarity in NLP(分布式相似性)

Distributional Similarity in NLP(分布式相似性) 分布式相似性(Distributional Similarity) 是自然语言处理(NLP)中的核心概念,基于“相似的单词出现在相似的上下文中”这一假设。它用于衡量单…

【C#学习】协程等待

来源GPT,仅记录学习 yield return WaitForEndOfFrame() 适用于 渲染结束后再执行代码,但 WebGL 可能不适合这个操作,会拖慢帧率。(渲染得太慢) yield return null; 让代码在下一帧的 Update() 里继续运行,更加流畅。 …