Dataset是一个分布式的数据集。
Dataset是Spark 1.6开始新引入的一个接口,它结合了RDD API的很多优点(包括强类型,支持lambda表达式等),以及Spark SQL的优点(优化后的执行引擎)。Dataset可以通过JVM对象来构造,然后通过transformation类算子(map,flatMap,filter等)来进行操作。Scala和Java的API中支持Dataset,但是Python不支持Dataset API。不过因为Python语言本身的天然动态特性,Dataset API的不少feature本身就已经具备了(比如可以通过row.columnName来直接获取某一行的某个字段)。R语言的情况跟Python也很类似。
Dataframe就是按列组织的Dataset。
在逻辑概念上,可以大概认为Dataframe等同于关系型数据库中的表,或者是Python/R语言中的data frame,但是在底层做了大量的优化。Dataframe可以通过很多方式来构造:比如结构化的数据文件,Hive表,数据库,已有的RDD。Scala,Java,Python,R等语言都支持Dataframe。在Scala API中,Dataframe就是Dataset[Row]的类型别名。在Java中,需要使用Dataset<Row>来代表一个Dataframe。
//样例类
case class Person(name: String, age: Int, height: Int)
case class People(age: Int, names: String)
case class Score(name: String, grade: Int)
//然后定义隐式转换
import spark.implicits._
//定义集合,创建dataset
//2、集合转成dataset
val seq = Seq(Person("xzw1", 21, 171), Person("zm", 21, 192), Person("mm", 36, 168))
val dstmp = spark.createDataset(seq)
dstmp.show()
//1、DataSet存储类型
val seq1 = Seq(Person("xzw1", 21, 171), Person("zm", 21, 192), Person("mm", 36, 168))
val ds1 = spark.createDataset(seq1)
ds1.show()
ds1.checkpoint()
ds1.cache()
ds1.persist()
ds1.count()
ds1.unpersist(true)
//2、DataSet结构属性
ds1.columns
ds1.dtypes
ds1.explain()
//3、DataSet rdd数据互换
val rdd1 = ds1.rdd
val ds2 = rdd1.toDS()
ds2.show()
val df2 = rdd1.toDF()
df2.show()
//4、保存文件
df2.select("name", "age", "height").write.format("csv").save("./save")