关于Datasets和DataFrame API存在很多混淆,因此在本文中,我们将了解Spark SQL,DataFrames和Datasets。
Spark SQL
它是一个用于结构化数据处理的Spark模块,它允许您编写更少的代码来完成工作,并且在底层,它可以智能地执行优化。Spark SQL模块由两个主要部分组成。我们将仅讨论本文的第一部分,它是结构API的表示,称为DataFrames和Datasets,它们定义了用于处理结构化数据的高级API。
Spark SQL模块的一个很酷的功能是能够执行SQL查询来执行数据处理,查询的结果将作为数据集或数据框返回。Spark SQL模块可以轻松读取数据并从以下任何格式写入数据; CSV,XML和JSON以及二进制数据的常见格式是Avro,Parquet和ORC。
DataFrames
数据框是一个分布式的数据集合,它按行组织,每行包含一组列,每列都有一个名称和一个关联的类型。换句话说,这个分布式数据集合具有由模式定义的结构。您可以将它视为关系数据库中的表,但在引擎盖下,它具有更丰富的优化。
与RDD一样,DataFrame提供两种类型的操作:转换和操作
对转换进行了延迟评估,并且热切地评估了操作。
创建DataFrame
有几种方法可以创建DataFrame; 其中一个常见的事情是需要隐式或显式地提供模式。
以下代码将完全使用Spark 2.x和Scala 2.11
从RDD创建DataFrame
val rdd = sc。并行化(1 到 10)。map(x =>(x,x * x))
val dataframe = spark。createDataFrame(rdd)。toDF(“key”,“sqaure”)
数据帧。show()
//输出:
+ --- + ----- +
| 关键| 价值|
+ --- + ----- +
| 1 | 1 |
| 2 | 4 |
| 3 | 9 |
| 4 | 16 |
| 5 | 25 |
| 6 | 36 |
| 7 | 49 |
| 8 | 64 |
| 9 | 81 |
| 10 | 100 |
+ --- + ----- +
数据集
数据集是一种强类型,不可变的数据集合。与DataFrame类似,数据集中的数据映射到定义的模式。它更多的是关于类型安全性并且是面向对象的。
DataFrame和数据集之间存在一些重要差异。
- 数据集中的每一行都由用户定义的对象表示,以便您可以将单个列称为该对象的成员变量。这为您提供了编译类型的安全性。
- 数据集具有称为编码器的帮助器,它是智能且高效的编码实用程序,可将每个用户定义对象内的数据转换为紧凑的二进制格式。如果数据集缓存在内存中,以及在混洗过程中Spark需要通过网络传输的字节数减少,这可以减少内存使用量。
创建数据集
有几种方法可以创建数据集:
- 第一种方法是使用DataFrame类的as(Symbol)函数将DataFrame转换为数据集。
- 第二种方法是使用SparkSession.createDataset()函数从本地对象集合创建数据集。
- 第三种方法是使用toDS隐式转换实用程序。
让我们看看创建数据集的不同方法
//使用SparkSession.createDataset()和toDS创建数据集
val movies = Seq(电影(“DDLJ”,“Awesome”,2018L), 电影(“ADHM”,“Nice”,2018L))
val moviesDS = spark。createDataset(localMovies)
电影DS。show()
val moviesDS1 = localMovies。toDS()
localMoviesDS1。show()
//为案例类创建编码器
case class Employee(name:String,age:Long)
val caseClassDS = Seq(Employee(“Amy”,32))。TODS
caseClassDS。show()
//将DataFrame转换为强类型数据集
案例 类 电影(ACTOR_NAME:字符串,MOVIE_TITLE:字符串,produced_year:龙)
val movies = Seq((“Damon,Matt”,“The Bourne Ultimatum”,2007L),
(“达蒙,马特”,“善意狩猎”,1997L))
val moviesDF = 电影。toDF。作为 [ 电影 ]
感谢您阅读本文,希望对您有所帮助。