
Spark 2.11 DataFrame创建全解析:多种方式与源码洞察
40KB |
更新于2024-08-29
| 152 浏览量 | 举报
收藏
在Spark 2.0版本中,DataFrame是Apache Spark的重要数据处理工具,它提供了一种结构化的、可以进行SQL查询的数据集。本文将详细介绍如何使用Spark 2.x的各种方式来创建DataFrame,包括案列类(CaseClass)、元组(Tuple)、JavaBean对象、JSON、Row对象、集合(Set和Map)、数组以及Parquet数组等数据结构。
首先,我们来看创建DataFrame的几种方法:
1. CaseClass创建DataFrame:
使用Scala的CaseClass(类似于Java的POJO)可以直接转化为DataFrame。CaseClass提供了结构化数据的定义,可以直接通过`toDF()`方法将CaseClass实例转换为DataFrame。例如,定义一个`Stu`案列类:
```scala
case class Stu(name: String, age: Int, city: String, score: Double)
```
可以这样创建DataFrame:
```scala
val stuList = List(Stu("张飞", 21, "北京", 80.0), ... ) // 填充列表
val stuDF = spark.createDataFrame(stuList.map(stu => Row(stu.name, stu.age, stu.city, stu.score)), StructType(Seq(
StructField("name", StringType, true),
StructField("age", IntegerType, true),
StructField("city", StringType, true),
StructField("score", DoubleType, true)
)))
```
2. Tuple创建DataFrame:
Spark支持元组类型,可以将元组转换为DataFrame。例如,使用`(String, Int, String, Double)`的元组创建DataFrame:
```scala
val tupleList = List(("张飞", 21, "北京", 80.0), ...) // 填充列表
val tupleDF = spark.createDataFrame(tupleList, StructType(Seq(
StructField("name", StringType, true),
StructField("age", IntegerType, true),
StructField("city", StringType, true),
StructField("score", DoubleType, true)
)))
```
3. JavaBean创建DataFrame:
如果数据源是JavaBean对象,需要先将其序列化为RDD,然后使用`createDataFrame()`函数创建DataFrame。例如,假设有一个`Student`类:
```java
public class Student {
private String name;
private int age;
// getters and setters
}
```
将JavaBean转换为RDD后创建DataFrame:
```java
JavaRDD<Student> javaRDD = ... // 从某种数据源获取JavaRDD
JavaPairRDD<String, Student> pairRDD = javaRDD.mapToPair(s -> new Tuple2<>(s.getName(), s));
DataFrame df = spark.createDataFrame(pairRDD, new StructType().add("name", StringType).add("student", Student.class));
```
4. Json创建DataFrame:
通过读取Json文件或字符串,可以使用`SparkSession.read.json()`方法创建DataFrame。例如:
```scala
val jsonString = "[{'name': '张飞', 'age': 21, 'city': '北京', 'score': 80.0}, ...]"
val jsonDF = spark.read.json(Seq(jsonString).toDS)
```
5. Row创建DataFrame:
使用Row直接构造DataFrame,Row是Spark中的轻量级、不可变的行对象:
```scala
val rowList = List(Row("张飞", 21, "北京", 80.0), ...) // 填充列表
val rowDF = spark.createDataFrame(rowList, schema)
```
6. 集合(Set和Map)创建DataFrame:
集合类型通常需要先转换为其他形式,如列表或数组,再创建DataFrame。
7. Array数组创建DataFrame:
类似于集合,Array也需要转换为列表或序列。
8. Parquet数组创建DataFrame:
如果数据存储在Parquet格式中,可以利用Spark的Parquet读取功能直接创建DataFrame。
在实际操作中,选择哪种方式取决于数据的原始来源和使用场景。Maven依赖部分列出了创建DataFrame时可能需要的一些库,如`scala-library`、`spark-sql`、`mysql-connector-java`等,它们分别用于不同功能的支持。
在分析和源码解析部分,会深入探讨这些方法背后的原理,包括Spark SQL的隐式转换机制、RDD与DataFrame之间的关系,以及如何处理不同类型的数据转换和映射过程。理解这些核心概念有助于更好地使用Spark DataFrame进行数据处理和分析。
相关推荐










weixin_38716081
- 粉丝: 4
最新资源
- C#程序添加声音的简易教程
- 仿Vista风格的带声音提示的Js模态窗口介绍
- VC++6.0开发的多项式运算软件
- 深入解析与应用Struts框架技术
- Java界面美化:探索丰富的Swing皮肤库
- 上海威迅教育学生分享编程学习资料
- YM12864液晶显示屏中文动态显示程序
- 日语能力考试三级语法桌面版学习工具
- VB开发的多页面浏览器1.1版:更少bug,更完善的体验
- C#实现VS界面的换肤技术教程
- C++实现的基础聊天程序:一对一通信机制
- 掌握jansen水晶报表版调整技巧教程
- DOS环境下C++利用控制台显示数字的方法
- 轻量级持久化框架SpeedFramework使用帮助文档
- MVC与DAO结合的开发实例解析
- 利用HttpModule实施高效的来访IP限制策略
- 驱动程序开发参考全攻略
- Visual C++网络编程:从 RFC 到游戏实现全解析
- .NET反翻译工具:掌握1.2和2.0版本反编译
- VB打字练习游戏开发与课程设计分享
- Struts中文手册:掌握框架技术的宝典
- Oracle数据库基础教程下载指南
- JSP教学管理系统的设计与实现
- Red Hat Linux基础教程:新手入门指南