RDD、DataFrame、DataSet的概念、区别联系、相互转换操作

目录

一,概念

1.RDD:

2.DataFrame:

3.DateSet:

二,区别

RDD:

DataFrame:

DataSet

三,联系

四,相互转换作用

一,概念

    RDD、DataFrame、Dataset都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利。RDD,作为Spark的核心数据抽象,是Spark当中不可或缺的存在,而在SparkSQL中,Spark为我们提供了两个新的抽象,分别是DataFrame和DataSet。

三者的概念分别为:

1.RDD:

全称Resilient Distributed Dataset,弹性分布式数据集,Spark中最基础的数据抽象,特点是RDD只包含数据本身,没有数据结构

2.DataFrame:

一个分布式数据容器,除数据本身,还记录了数据的结构信息,即schema;结构信息便于Spark知道该数据集中包含了哪些列,每一列的类型和数据是什么

3.DateSet:

Spark中最上层的数据抽象,不仅包含数据本身,记录了数据的结构信息schema,还包含了数据集的类型,也就是真正把数据集做成了一个java对象的形式,需要先创建一个样例类case class,把数据做成样例类的格式,每一列就是样例类里的属性

二,区别

RDD:

1、RDD⼀般和spark mlib同时使⽤

2、RDD不⽀持sparksql操作

DataFrame:

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

DataSet

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]

你可能感兴趣的:(大数据,spark,人工智能)