Spark SQL结构化数据文件处理_Dataset简介及创建.

434 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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类型,每列的值无法直接访问,只有通过解析才能获取各个字段的值。

image.png Dataset数据的表现形式,序号(3)和(4),其中序号(3)是在RDD每行数据的基础之上,添加一个数据类型(value:String)作为Schema元数据信息。而序号(4)每行数据添加People强数据类型,在Dataset[Person]中里存放了3个属性,Dataset每行数据类型可自定义,一旦定义后,就具有错误检查机制。

image.png

Dataset对象的创建

  • 从集合创建DataSet
  • 从rdd创建DataSet
  • 从DataFrame创建DataSet

1、从集合创建Dataset,

调用SparkSession中的createDataset
createDataset[T](data: List[T])

image.png

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()

image.png

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

image.png

3、从DataFrame创建Dataset

通过“as[ElementType]”方法转换得到Dataset dataSet=dataFrame.as[强类型]

image.png

image.png

image.png