没有合适的资源?快使用搜索试试~ 我知道了~
RDD、DataFrame和DataSet三者之间的关系
需积分: 5 1 下载量 36 浏览量
2023-03-22
20:42:12
上传
评论
收藏 53KB DOCX 举报
温馨提示
试读
12页
分别介绍使用RDD、Data Frame和DataSet实现以Word Count的方法
资源推荐
资源详情
资源评论
RDD、DataFrame 和 DataSet 三者之间的关系及使用方法
1、RDD、DataFrame 和 DataSet 的定义
Spark RDD:RDD 代表弹性分布式数据集。它是记录的只读分区集合。 RDD 是 Spark
的基本数据结构。它允许程序员以容错方式在大型集群上执行内存计算。
Spark Dataframe:与 RDD 不同,数据组以列的形式组织起来,类似于关系数据库中的
表。它是一个不可变的分布式数据集合。 Spark 中的 DataFrame 允许开发人员将数据
结构(类型)加到分布式数据集合上,从而实现更高级别的抽象。
Spark Dataset:Apache Spark 中的 Dataset 是 DataFrame API 的扩展,它提供了类型安
全(type-safe),面向对象(object-oriented)的编程接口。 Dataset 利用 Catalyst optimizer
可以让用户通过类似于 sql 的表达式对数据进行查询。
2、数据格式
假设 RDD 中的两行数据长这样:
1
丽丽
23
女
2
明明
12
男
则 DataFrame 中的数据长这样:
ID:String
Name:String
Age:Int
Gender:String
1
丽丽
23
女
2
明明
12
男
则 Dataset 中的数据长这样:
Value Person[ID:String,Name:String,Age:Int,Gender:String]
Person (id=1,Name=丽丽,Age=23,Gender=女)
Person (id=2,Name=明明,Age=12,Gender=男)
或者长这样(每行数据是个 Object):
value :String
(1,丽丽,23,女)
(2,明明,12,男)
DataSet 包 含 了 DataFrame 的 功 能 , Spark2.0 中 两 者 统 一 , DataFrame 表 示 为
DataSet[Row],即 DataSet 的子集。
RDD:它可以轻松有效地处理结构化和非结构化的数据。 和Dataframe 和 DataSet 一样,RDD
不会推断出所获取的数据的结构类型,需要用户来指定它。
DataFrame:仅适用于结构化和半结构化数据。 它的数据以命名列的形式组织起来。
Dataset:它也可以有效地处理结构化和非结构化数据。 它表示行(row)的 JVM 对象或行对
象集合形式的数据。 它通过编码器以表格形式(tabular forms)表示。
3、编译时类型安全
RDD:RDD 提供了一种熟悉的面向对象编程风格,具有编译时类型安全性。
DataFrame:如果您尝试访问表中不存在的列,不会发生编译错误。 它仅在运行时检测属
性错误。
Dataset:DataSet 可以在编译时检查类型, 它提供编译时类型安全性。
4、RDD、DataFrame 和 DataSet 三者之间的转换
DataFrame
RDD
DataSet
.toDS
.toDF
.as(case class)
.rdd
.rdd
.toDF
采用 scala 编程实现三者之间的转换代码如下所示
表 1 三者之间相互转换代码
package edu.jlu.sql
import org.apache.spark.sql._
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
/**
* rdd DataFrame DataSet 相互转换
*/
object rddDataFrameDataSet {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("topn")
.master("local[2]")
.getOrCreate()
// val df = rddToDataFrame(spark)
// df.printSchema()
// df.select("_1", "_2").show()
// val ds = rddToDataSet(spark)
// ds.createTempView("wordcount")
// spark.sql("select word,count(word) as count from wordcount group by word order
by count desc limit 5").show()
// val df = dataSetToDataFrame(spark)
// df.select("word", "count").groupBy("word").count().show()
//dataSetToRDD(spark)
// dataFrameToRDD(spark)
// dataSetToRDD(spark)
// rddToDataFrame(spark)
dataSetToDataFrame(spark)
}
/**
* dataFrame 转 RDD
*/
def dataFrameToRDD(spark:SparkSession)={
import spark.implicits._
val df = spark.read.json("F:\\code\\hadoop\\data\\people.json")
df.show()
df.printSchema()
df.select("name").show()
df.createTempView("people")
val result = spark.sql("select name from people where age >=13 and age <=19")
result.rdd.foreach(println)
}
/**
* dataset 转 RDD
* scala 中正则表达式 \s 是用来匹配任何空白字符,当\放在最前面,前面得再放个\,
或者在 scala 中用"""\s+"""
*/
剩余11页未读,继续阅读
资源评论
jasmine_wxy
- 粉丝: 11
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功