DataSet是什么
-
是Dataframe API的一个扩展,是Spark最新的数据抽象。 -
具有类型安全检查也具有Dataframe的查询优化特性,API风格更友好 -
DataSet支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提升效率 -
样例类被用来在Dataset中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称 -
Dataframe是Dataset的特列,DataFrame=Dataset[Row]?,所以可以通过as方法将Dataframe转换为Dataset。Row是一个类型,跟Car、Person这些的类型一样,所有的表结构信息我都用Row来表示 -
DataSet是强类型的。DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错,而DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。就跟JSON对象和类对象之间的类比,比如可以有Dataset[Car],Dataset[Person].
?DataSet创建
DataFrameReader.textFile("path")
val rdd: sql.Dataset[String] = session.read.option("multiLine", true)
.textFile("D:\\Java\\workspace\\study\\scala-demo\\src\\main\\scala\\com\\example\\scala\\rdd\\ming.txt")
rdd.show()
?toDs()方法
case class Emperor(name: String, age: Int)
def testDs(session: SparkSession) = {
import session.implicits._
val emperor: sql.Dataset[Emperor] = Seq(Emperor("朱元璋", 41)).toDS()
emperor.show()
}
DataSet转换成RDD
直接使用rdd属性获取RDD
def testDs(session: SparkSession) = {
val rdd: sql.Dataset[String] = session.read.option("multiLine", true)
.textFile("D:\\Java\\workspace\\study\\scala-demo\\src\\main\\scala\\com\\example\\scala\\rdd\\ming.txt")
rdd.show()
import session.implicits._
val emperor: sql.Dataset[Emperor] = Seq(Emperor("朱元璋", 41)).toDS()
emperor.show()
// 转换到rdd
emperor.rdd.foreach(x => print(x) + ", ")
}
?
|