持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
Dataset简介
Dataset是从Spark1.6 Alpha版本中引入的一个新的数据抽象结构,最终在Spark2.0版本被定义成Spark新特性。Dataset提供了特定域对象中的强类型集合,也就是在RDD的每行数据中添加了类型约束条件,只有约束条件的数据类型才能正常运行。Dataset结合了RDD和DataFrame的优点。
- DataFrame的缺点如下:
1.编译时不能类型转化安全检查,运行时才能确定是否有问题。
2.对于对象支持不友好,rdd内部数据直接以java对象存储,dataframe内存存储的是row对象而不能是自定义对象。 - Dataset在Spark2.0版本被定义成Spark新特性。
- DataSet是分布式的数据集合,DataSet提供了强类型支持,也是在RDD的每行数据加了类型约束。
- DataFrame表示为DataSet[Row],即DataSet的子集。
RDD、DataFrame及Dataset的区别
RDD数据的表现形式,即序号(1),此时RDD数据没有数据类型和元数据信息。 DataFrame数据的表现形式,即序号(2),此时DataFrame数据中添加Schema元数据信息(列名和数据类型,如ID:String),DataFrame每行类型固定为Row类型,每列的值无法直接访问,只有通过解析才能获取各个字段的值。
Dataset数据的表现形式,序号(3)和(4),其中序号(3)是在RDD每行数据的基础之上,添加一个数据类型(value:String)作为Schema元数据信息。而序号(4)每行数据添加People强数据类型,在Dataset[Person]中里存放了3个属性,Dataset每行数据类型可自定义,一旦定义后,就具有错误检查机制。
Dataset对象的创建
- 从集合创建DataSet
- 从rdd创建DataSet
- 从DataFrame创建DataSet
1、从集合创建Dataset,
调用SparkSession中的createDataset
createDataset[T](data: List[T])
2、从RDD创建Dataset
调用SparkSession中的createDataset createDataset[T](data: RDD[T])
scala > val personDs=spark.createDataset(sc.textFile("/sparkdata/person.txt"))
personDs: org.apache.spark.sql.Dataset[String] = [value: string]
scala > personDs.show()
scala> case class Person(id:Int,name:String,age:Int)
scala> val personRDD = sc.textFile("/sparkdata/person.txt").map(_.split(" ")).map(x=>Person(x(0).toInt, x(1), x(2).toInt))
scala> val ds3=spark.createDataset(personRDD)
scala> ds3.show
3、从DataFrame创建Dataset
通过“as[ElementType]”方法转换得到Dataset dataSet=dataFrame.as[强类型]