了解Spark SQL,DataFrame和数据集

对于数据集和DataFrameAPI存在很多混淆,因此在本文中,我们将带领大家了解SparkSQL、DataFrames和DataSet。

Spark SQL

它是一个用于结构化数据处理的Spark模块,它允许你编写更少的代码来完成任务,并且在底层,它可以智能地执行优化。SparkSQL模块由两个主要部分组成。我们将只讨论第一部分,即结构API的表示,称为DataFrames和DataSet,它们定义了用于处理结构化数据的高级API。

Spark SQL模块的一个很酷的功能是能够执行SQL查询来执行数据处理,查询的结果将作为数据集或数据框返回。 Spark SQL模块可以轻松读取数据并从以下任何格式写入数据; CSV,XML和JSON以及二进制数据的常见格式是Avro,Parquet和ORC。

DataFrames

数据框是一个分布式的数据集合,它按行组织,每行包含一组列,每列都有一个名称和一个关联的类型。换句话说,这个分布式数据集合具有由模式定义的结构。你可以将它视为关系数据库中的表,但在底层,它具有更丰富的优化。

与RDD一样,DataFrame提供两种类型的操作:转换和操作。

对转换进行了延迟评估,并且评估操作。

创建DataFrames

创建DataFrame的方法有几种,其中一个常见的方法是需要隐式或显式地提供模式。

以下代码将完全使用Spark 2.x和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(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

不代表云加社区观点,更多详情请查看原文链接

原文链接:https://dzone.com/articles/understanding-of-spark-sql-dataframes-and-datasets

原文作者:Teena Vashist

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏灯塔大数据

每周学点大数据 | No.72 在 Spark 上实现 WordCount

编者按:灯塔大数据将每周持续推出《从零开始学大数据算法》的连载,本书为哈尔滨工业大学著名教授王宏志老师的扛鼎力作,以对话的形式深入浅出的从何为大数据说到大数据...

3535
来自专栏公有云大数据平台弹性 MapReduce

分布式sql引擎原理分析-逻辑执行计划生成

本文档以当前流行的分布式大数据查询引擎Presto为切入点,分析一个query语句怎么生成为一个分段的逻辑计划。

1.1K13
来自专栏编程一生

lucene原理及源码解析--核心类

1552
来自专栏一名叫大蕉的程序员

简约的JAVA版本MapReduce和日常No.25

昨天做了一个小调查,说看看想看些啥。大概的分布是这样的,一个1代表一个投票。看来还是2、3比较多。 11111 希望看到"算法"回复1。 111...

1955
来自专栏编程一生

谈面试时从写一个单例开始究竟能问多深及终极解决方案

1484
来自专栏Jimoer

Java设计模式学习记录-桥接模式

这次介绍结构型设计模式中的第二种模式,桥接模式。 使用桥接模式的目的就是为了解耦,松散的耦合更利于扩展,但是会增加相应的代码量和设计难度。

722
来自专栏深度学习之tensorflow实战篇

计算机常用算法对照表整理

常用对照: NLP CRF算法: 中文名称条件随机场算法,外文名称conditional random field algorithm,是一种数学算法,是2...

4805
来自专栏跟着阿笨一起玩NET

采用左右值编码来存储无限分级树形结构的数据库表设计

该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由...

3561
来自专栏后端技术探索

php进阶

基本数据类型和数组都为真复制,即为真副本,当属性为对象时,为假复制,改变副本仍会影响原对象.解决方案:

1551
来自专栏Android开发实战

设计模式-适配器模式

适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

1165

扫码关注云+社区

领取腾讯云代金券