对于数据集和DataFrameAPI存在很多混淆,因此在本文中,我们将了解SparkSQL、DataFrames和DataSet。
火花SQL
它是一个用于结构化数据处理的SparkModule,它允许您编写更少的代码来完成任务,并且在幕后,它可以智能地执行优化。SparkSQL模块由两个主要部分组成。我们将只讨论本文的第一部分,即结构API的表示,称为DataFrames和DataSet,它们定义了用于处理结构化数据的高级API。
SparkSQL模块的一个很酷的特性是能够执行SQL查询来执行数据处理,查询的结果将作为DataSet或DataFrame返回。SparkSQL模块使从以下任何格式读取数据和写入数据变得非常容易;CSV、XML和JSON以及二进制数据的常见格式有Avro、Parquet和ORC。
DataFrames
dataframe是组织成行的分布式数据集合,其中每一行由一组列组成,每个列都有一个名称和一个关联类型。换句话说,这个分布式数据集合具有一个由模式定义的结构。您可以将其视为关系数据库中的表,但在幕后,它具有更丰富的优化。
与RDD一样,DataFrame提供两种类型的操作:转换和操作。
转换被懒惰地评估,动作被急切地评估。
创建DataFrames
创建DataFrame的方法有几种;其中一个常见的方法是需要隐式或显式地提供模式。
The following code will work perfectly from Spark 2.x with Scala 2.11
从RDDs创建DataFrames
val rdd = sc.parallelize(1 to 10).map(x => (x, x * x))
val dataframe = spark.createDataFrame(rdd).toDF("key", "sqaure")
dataframe.show()
//Output:
+---+-----+
|key|value|
+---+-----+
| 1| 1|
| 2| 4|
| 3| 9|
| 4| 16|
| 5| 25|
| 6| 36|
| 7| 49|
| 8| 64|
| 9| 81|
| 10| 100|
+---+-----+
数据集
DataSet是一个强类型的、不可变的数据集合。与DataFrame类似,DataSet中的数据被映射到定义的架构中。它更多的是关于类型安全和面向对象的。
DataFrame和DataSet之间有几个重要的区别。
- DataSet中的每一行都由用户定义的对象表示,因此可以将单个列作为该对象的成员变量。这为您提供了编译类型的安全性。
- DataSet有称为编码器的帮助程序,它是智能和高效的编码实用程序,可以将每个用户定义的对象内的数据转换为紧凑的二进制格式。这意味着,如果数据集被缓存在内存中,则内存使用量将减少,以及SPark在洗牌过程中需要通过网络传输的字节数减少。
创建数据集
有几种方法可以创建数据集:
- 第一种方法是使用DataFrame类的as(符号)函数将DataFrame转换为DataSet。
- 第二种方法是使用SparkSession.createDataset()函数从对象的本地集合创建数据集。
- 第三种方法是使用Tods隐式转换实用程序。
让我们看看创建数据集的不同方法
// create a Dataset using SparkSession.createDataset() and the toDS
val movies = Seq(Movie("DDLJ", "Awesome", 2018L), Movie("ADHM", "Nice", 2018L))
val moviesDS = spark.createDataset(localMovies)
moviesDS.show()
val moviesDS1 = localMovies.toDS()
localMoviesDS1.show()
// Encoders are created for case classes
case class Employee(name: String, age: Long)
val caseClassDS = Seq(Employee("Amy", 32)).toDS
caseClassDS.show()
// convert DataFrame to strongly typed Dataset
case class Movie(actor_name:String, movie_title:String, produced_year:Long)
val movies = Seq(("Damon, Matt", "The Bourne Ultimatum", 2007L),
("Damon, Matt", "Good Will Hunting", 1997L))
val moviesDF = movies.toDF.as[Movie]
谢谢你阅读这篇文章,希望能对你有所帮助。