Spark(十)SparkSQL DataSet
DataSet
- DataSet是具有强类型的数据集合,需要提供对应的类型信息
1. 创建DataSet
使用样例类序列创建DataSet
scala> case class person(id:Int,name:String,age:Int)
defined class person
scala> val caseClassDS = Seq(person(1,"zhangsan",23)).toDS()
caseClassDS: org.apache.spark.sql.Dataset[person] = [id: int, name: string ... 1 more field]
scala> caseClassDS.show()
+---+--------+---+
| id| name|age|
+---+--------+---+
| 1|zhangsan| 23|
+---+--------+---+
**使用基本类型序列创建DataSet
scala> val DS = Seq(1,2,3).toDS
DS: org.apache.spark.sql.Dataset[Int] = [value: int]
scala> DS.show()
+-----+
|value|
+-----+
| 1|
| 2|
| 3|
+-----+
2. RDD转化为DataSet
- SparkSQL能够自动将包含有case类的RDD转换成DataSet
- case类定义了table的结构,case类属性通过反射变成了表的列名
- Case类可以包含诸如Seq或者Array等复杂的结构
3. DataSet转换为RDD
scala> val RDD = DS.rdd
RDD: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[44] at rdd at <console>:25
scala> RDD.collect
res24: Array[Int] = Array(1, 2, 3)
4. DataFrame和DataSet转换
scala> val personDS = personDF.as[person]
personDS: org.apache.spark.sql.Dataset[person] = [id: int, name: string ... 1 more field]
scala> val DF = DS.toDF
DF: org.apache.spark.sql.DataFrame = [value: int]
scala> DF.show()
+-----+
|value|
+-----+
| 1|
| 2|
| 3|
+-----+
RDD、DataFrame、DataSet三者的关系
- 如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果
共性
- RDD、DataFrame、DataSet全都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利
- 三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action如foreach时,三者才会开始遍历运算
- 三者有许多共同的函数,如filter,排序等
- 在对DataFrame和Dataset进行操作许多操作都需要这个包:import spark.implicits._
- 三者都会根据Spark的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出
- 三者都有partition的概念
- DataFrame和DataSet均可使用模式匹配获取各个字段的值和类型
区别
RDD
- RDD一般和spark mllib同时使用
- RDD不支持sparksql操作
DataFrame
- 与RDD和Dataset不同,DataFrame每一行的类型固定为Row,每一列的值没法直接访问,只有通过解析才能获取各个字段的值
- DataFrame与DataSet一般不与spark mllib同时使用
- DataFrame与DataSet均支持SparkSQL的操作,比如select,groupby之类,还能注册临时表/视窗,进行sql语句操作
- DataFrame与DataSet支持一些特别方便的保存方式,比如保存成csv,可以带上表头,这样每一列的字段名一目了然
DataSet
- Dataset和DataFrame拥有完全相同的成员函数,区别只是每一行的数据类型不同,DataFrame其实就是DataSet的一个特例
- DataFrame也可以叫 Dataset[Row],每一行的类型是Row,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知,只能用getAS方法或模式匹配拿出特定字段,而Dataset中,每一行是什么类型是不一定的,在自定义了case class之后可以很自由的获得每一行的信息
分类:
Spark
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)