1. 概述
DataSet是分布式数据集合。DataSet是Spark 1.6中添加的一个新抽象,是DataFrame的一个扩展。它提供了RDD的优势(强类型,使用强大的lambda函数的能力)以及Spark SQL优化执行引擎的优点。DataSet也可以使用功能性的转换(操作map,flatMap,filter等等)。
- 是DataFrame API的一个扩展,是SparkSQL最新的数据抽象
- 用户友好的API风格,既具有类型安全检查也具有DataFrame的查询优化特性;
- 用样例类来定义DataSet中数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称;
- DataSet是强类型的。比如可以有DataSet[Car],DataSet[Person]。
- DataFrame是DataSet的特列,DataFrame=DataSet[Row] ,所以可以通过as方法将DataFrame转换为DataSet。Row是一个类型,跟Car、Person这些的类型一样,所有的表结构信息都用Row来表示。
2. 创建DataSet
1)使用样例类序列创建DataSet
scala> case class Person(name: String, age: Long)
defined class Person
scala> val caseClassDS = Seq(Person("wangyuyan",2)).toDS()
caseClassDS: org.apache.spark.sql.Dataset[Person] = [name: string, age: Long]
scala> caseClassDS.show
+---------+---+
| name|age|
+---------+---+
|wangyuyan| 2|
+---------+---+
2)使用基本类型的序列创建DataSet
scala> val ds = Seq(1,2,3,4,5,6).toDS
ds: org.apache.spark.sql.Dataset[Int] = [value: int]
scala> ds.show
+-----+
|value|
+-----+
| 1|
| 2|
| 3|
| 4|
| 5|
| 6|
+-----+
注意:在实际使用的时候,很少用到把序列转换成DataSet,更多是通过RDD来得到DataSet
3. RDD转为DataSet
SparkSQL能够自动将包含有样例类的RDD转换成DataSet,样例类定义了table的结构,样例类属性通过反射变成了表的列名。样例类可以包含诸如Seq或者Array等复杂的结构。
1)创建一个RDD
scala> val peopleRDD = sc.textFile("/opt/module/spark-local/people.txt")
peopleRDD: org.apache.spark.rdd.RDD[String] = /opt/module/spark-
local/people.txt MapPartitionsRDD[19] at textFile at <console>:24
2)创建一个样例类
scala> case class Person(name:String,age:Int)
defined class Person
3)将RDD转化为DataSet
scala> peopleRDD.map(line => {val fields =
line.split(",");Person(fields(0),fields(1). toInt)}).toDS
res0: org.apache.spark.sql.Dataset[Person] = [name: string, age: Long]
4.DataSet转为RDD
调用rdd方法即可。 1)创建一个DataSet
scala> val DS = Seq(Person("zhangcuishan", 32)).toDS()
DS: org.apache.spark.sql.Dataset[Person] = [name: string, age: Long]
2)将DataSet转换为RDD
scala> DS.rdd
res1: org.apache.spark.rdd.RDD[Person] = MapPartitionsRDD[6] at rdd
at <console>:28