对于数据集和DataFrameAPI存在很多混淆,因此在本文中,我们将带领大家了解SparkSQL、DataFrames和DataSet。
它是一个用于结构化数据处理的Spark模块,它允许你编写更少的代码来完成任务,并且在底层,它可以智能地执行优化。SparkSQL模块由两个主要部分组成。我们将只讨论第一部分,即结构API的表示,称为DataFrames和DataSet,它们定义了用于处理结构化数据的高级API。
Spark SQL模块的一个很酷的功能是能够执行SQL查询来执行数据处理,查询的结果将作为数据集或数据框返回。 Spark SQL模块可以轻松读取数据并从以下任何格式写入数据; CSV,XML和JSON以及二进制数据的常见格式是Avro,Parquet和ORC。
数据框是一个分布式的数据集合,它按行组织,每行包含一组列,每列都有一个名称和一个关联的类型。换句话说,这个分布式数据集合具有由模式定义的结构。你可以将它视为关系数据库中的表,但在底层,它具有更丰富的优化。
与RDD一样,DataFrame提供两种类型的操作:转换和操作。
对转换进行了延迟评估,并且评估操作。
创建DataFrame的方法有几种,其中一个常见的方法是需要隐式或显式地提供模式。
以下代码将完全使用Spark 2.x和Scala 2.11
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(symbol)函数将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]
谢谢你阅读这篇文章,希望能对你有所帮助。
原文标题《Understanding Spark SQL, DataFrames, and Datasets》
作者:Teena Vashist
译者:lemon
不代表云加社区观点,更多详情请查看原文链接
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。