1. 概念:
RDD:
弹性分布式数据集;
DataFrame:
DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。这样的数据集可以用SQL查询。DataFrame是不可变的,即一旦创建,就不能修改其内容。
DataFrame 是 DataSet[Row]
DataSet:
简单的说,DataSet和DataFrame的区别就是,DataSet会在编译阶段就进行类型检查 ,而DataFrame在运行阶段才会类型检查。
Dataset是一个强类型的特定领域的对象,Dataset也被称为DataFrame的类型化视图,这种DataFrame是Row类型的Dataset,即Dataset[Row]。Dataset结合了DataFrame的优化和RDD的类型安全。Dataset提供了编译时类型检查(而DataFrame不会,DataFrame只会在运行阶段才会检查类型),确保数据在编译阶段就符合预期的类型。
dataset是dataFrame的升级版对象,dataframe是一个传统的sql编程对象,如果要想使用dataframe进行灵活开发的比较复杂。
dataset和dataFrame是一个类别的对象,都是可以进行sql查询数据的,并且可以支持rdd上面的方法。
当我们需要对一个表对象进行二次处理的话建议大家转换为dataset而不是dataframe。
package com.hainiu.spark
import org.apache.spark.sql.{Dataset, SparkSession}
object TestDSAndDF {
def main(args: Array[String]): Unit = {
val session = SparkSession.builder().master("local[*]").appName("test").getOrCreate()
import session.implicits._
val ds: Dataset[String] = session.read.textFile("file:///headless/workspace/spark/data/a.txt")
ds.map(t=>{
val strs = t.split(" ")
(strs(0), strs(1), strs(2), strs(3))
})
// val df = session.read.format("org.apache.spark.sql.execution.datasources.v2.text.TextDataSourceV2")
// .load("file:///headless/workspace/spark/data/a.txt")
//
// val ds: Dataset[(String, String, String, String)] = df.map(row => {
// val line = row.getAs[String]("value")
// val strs = line.split(" ")
// (strs(0), strs(1), strs(2), strs(3))
// })
}
}
2. 三者之间的转换
val ds: Dataset[String] = session.read.textFile("file:///headless/workspace/spark/data/a.txt")
ds.map(t=>{
val strs = t.split(" ")
(strs(0), strs(1), strs(2), strs(3))
})
val df1 = ds.toDF("id","name","age","gender")
val df: Dataset[Row] = session.read.format("org.apache.spark.sql.execution.datasources.v2.text.TextDataSourceV2")
.load("file:///headless/workspace/spark/data/a.txt")
val rdd = session.sparkContext.textFile("file:///headless/workspace/spark/data/a.txt")
rdd.toDS()
rdd.toDF()
df.rdd
ds.rdd