0
点赞
收藏
分享

微信扫一扫

了解SparkSQL、DataFrames和数据集


对于数据集和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]

谢谢你阅读这篇文章,希望能对你有所帮助。

举报

相关推荐

0 条评论