目录
一,概念
1.RDD:
2.DataFrame:
3.DateSet:
二,区别
RDD:
DataFrame:
DataSet
三,联系
四,相互转换作用
RDD、DataFrame、Dataset都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利。RDD,作为Spark的核心数据抽象,是Spark当中不可或缺的存在,而在SparkSQL中,Spark为我们提供了两个新的抽象,分别是DataFrame和DataSet。
三者的概念分别为:
全称Resilient Distributed Dataset,弹性分布式数据集,Spark中最基础的数据抽象,特点是RDD只包含数据本身,没有数据结构
一个分布式数据容器,除数据本身,还记录了数据的结构信息,即schema;结构信息便于Spark知道该数据集中包含了哪些列,每一列的类型和数据是什么
Spark中最上层的数据抽象,不仅包含数据本身,记录了数据的结构信息schema,还包含了数据集的类型,也就是真正把数据集做成了一个java对象的形式,需要先创建一个样例类case class,把数据做成样例类的格式,每一列就是样例类里的属性
1、RDD⼀般和spark mlib同时使⽤
2、RDD不⽀持sparksql操作
1、与RDD和Dataset不同,DataFrame每⼀⾏的类型固定为Row,只有通过解析才能获取各个字段的值
testDF.foreach{
line =>
val col1=line.getAs[String]("col1")
val col2=line.getAs[String]("col2")
}
2、DataFrame与Dataset⼀般与spark ml同时使⽤
3、DataFrame与Dataset均⽀持sparksql的操作,⽐如select,groupby之类,还能注册临时表/视窗,进⾏sql语句操作
4、DataFrame与Dataset⽀持⼀些特别⽅便的保存⽅式,⽐如保存成csv,可以带上表头,这样每⼀列的字段名⼀⽬了然
val saveoptions = Map("header" -> "true", "delimiter" -> "\t", "path" -> "hdfs://172.xx.xx.xx:9000/test")
datawDF.write.format("com.databricks.spark.csv").mode(SaveMode.Overwrite).options(saveoptions).save()
val options = Map("header" -> "true", "delimiter" -> "\t", "path" -> "hdfs://172.xx.xx.xx:9000/test")
val datarDF= spark.read.options(options).format("com.databricks.spark.csv").load()
1.DataFrame表达的含义是一个支持函数式操作的 表
, 而 Dataset表达是是一个类似 RDD的东西, Dataset可以处理任何对象
2.DataFrame中所存放的是 Row对象, 而 Dataset中可以存放任何类型的对象
3.DataFrame在进行强类型操作时候, 例如 map算子, 其所处理的数据类型永远是 Row
ds.map( (item: People) => People(item.name, item.age * 10) ).show()
4.Dataset能做到编译和运行时都有类型检查
val ds: Dataset[People] = Seq(People("zhangsan", 15), People("lisi", 15)).toDS()
//这行代码明显报错, 无法通过编译
ds.map(person => person.hello)
1. RDD、DataFrame、DataSet全都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利;
2. 三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action如foreach时,三者才会开始遍历运算;
3. 三者有许多共同的函数,如filter,排序等;
4. 在对DataFrame和Dataset进行操作许多操作都需要这个包:import spark.implicits._(在创建好SparkSession对象后尽量直接导入);
5. 三者都会根据 Spark 的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出;
6. 三者都有partition的概念;
7. DataFrame和Dataset均可使用模式匹配获取各个字段的值和类型。
1.DataFrame和Dataset转RDD:
val rdd1=testDF.rdd
val rdd2=testDS.rdd
2.RDD转DataFrame,一般用元组把一行的数据写在一起,然后在toDF中指定字段名
import spark.implicits._
val testDF = rdd.map {line=>
(line._1,line._2)
}.toDF("a1","a22")
3.RDD转Dataet,核心就是要定义case class
import spark.implicits._
case class Coltest(col1:String, col2:Int)
val testDS = rdd.map{line=>Coltest(line._1,line._2)}.toDS
4.DataSet转DataFrame,只是把 case class 封装成Row
import spark.implicits._
val testDF = testDS.toDF
5.DataFrame转DataSet,每一列的类型后,使用as方法(as方法后面还是跟的case class,这个是核心),转成Dataset
import spark.implicits._
case class Coltest … …
val testDS = testDF.as[Coltest]