一句话概括,二者的关系就是

 DataFrame = Dataset[Row]

就是说 DataFrame是 Dataset泛型为Row的一种特例,而Dataset的泛型还可以是其他东西,比如自定义类Person等等

object DataSetDemo1 extends App {val spark: SparkSession = SparkSession.builder().appName("SparkSQL").master("local").getOrCreate()import spark.implicits._private val girls = Seq(Girl(1, "李伟", 1, 180.0),Girl(2, "汪松伟", 2, 179.0),Girl(3, "常洪浩", 1, 183.0),Girl(4, "麻宁娜", 0, 168.0))//Dataset[Girl]中的泛型可以为任意类型,可以是自定义类型//DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查//样例类被用来在Dataset中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称private val ds: Dataset[Girl] = spark.createDataset(girls)private val ds1: Array[Girl] = ds.collect()//循环遍历取出ds中的Girl对象for (x <- ds1) {println(x)println(x.height)}//DataFrame=Dataset[Row].就是说df是ds的一种特殊情况,特殊在泛型是个ROW.private val df: Dataset[Row] = spark.createDataFrame(girls)private val df1: Array[Row] = df.collect()//遍历取出df中的对象,只能利用Row对象的一些方法取出//DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错for (x <- df1) {println(x)println(x.getAs("height"))}
//df可以通过as转为ds对象,其实就是用一个具体的类换掉泛型Row
private val value: Dataset[Girl] = df.as[Girl]private val df2ds: Array[Girl] = value.collect()for(x<-df2ds){println(x)}
//至于ds转df,则更为简单,泛型换位Row就可以了,这个过程中比如丢掉了一些信息private val value1: DataFrame = ds.toDF()private val ds2df: Array[Row] = value1.collect()spark.stop()}case class Girl(id: Int, name: String, sex: Int, height: Double)

总结

  • df转ds,通过as,传入一个具体的泛型
  • ds转df,toDF方法,这个方向更容易
  • 正常情况下优先用ds,因为知道是个什么东西,要是写成df,就是个Row对象.就用起来不太方便
  • 如果要写一些适配性很强的函数时,如果使用Dataset,行的类型又不确定,可能是各种case class,无法实现适配,这时候用DataFrame即Dataset[Row]就能比较好的解决问题

spark DataSet与DataFrame的区别相关推荐

  1. sql能查到数据 dataset对象里面没有值_spark系列:RDD、DataSet、DataFrame的区别

    RDD与DataSet的区别 二者都是由元素构成的分布式数据集合 1. 对于spark来说,并不知道RDD元素的内部结构,仅仅知道元素本身的类型,只有用户才了解元素的内部结构,才可以进行处理.分析:但 ...

  2. 再论DataSet与DataFrame的区别

    需求 计算每个商品分类的成交量 假设有如下csv数据 A0001 202.106.196.115 手机 iphone8 8000 A0002 202.106.196.116 服装 Tshirt 450 ...

  3. Spark性能优化 -- Spark SQL、DataFrame、Dataset

    本文将详细分析和总结Spark SQL及其DataFrame.Dataset的相关原理和优化过程. Spark SQL简介 Spark SQL是Spark中 具有 大规模关系查询的结构化数据处理 模块 ...

  4. 大数据入门:Spark RDD、DataFrame、DataSet

    在Spark的学习当中,RDD.DataFrame.DataSet可以说都是需要着重理解的专业名词概念.尤其是在涉及到数据结构的部分,理解清楚这三者的共性与区别,非常有必要.今天的大数据入门分享,我们 ...

  5. RDD和DataFrame和DataSet三者间的区别

    RDD:rdd是一个不可变的支持Lambda表达式的并行数据集合 Dataframe:与RDD类似,Dataframe是一个分布式的数据容器,除来数据本身,还记录着数据的结构信息,即schema,Da ...

  6. Spark —— RDD、DataFrame 与 Dataset

    0. DataFrame 的成员函数及操作 DataFrame 需要有属性列名,比如某 df有两个属性列,user/artist: df.agg(min("user"), max( ...

  7. hadoop组件---spark----全面了解spark以及与hadoop的区别

    Spark是什么 Spark (全称 Apache Spark™) 是一个专门处理大数据量分析任务的通用数据分析引擎. spark官网 Spark核心代码是用scala语言开发的,不过支持使用多种语言 ...

  8. SparkSQL之“Dataset和Dataframe

    package zsyh.sprk.coreimport org.apache.spark.sql.{DataFrame, Dataset, SparkSession} case class Pers ...

  9. 学习笔记Spark(八)—— Spark SQL应用(3)—— Spark DataSet基础操作

    三.Spark DataSet基本操作 3.1.DataSet简介 DataSet是分布式的数据集合,DataSet提供了强类型支持,也是在RDD的每行数据加了类型约束. DateSet整合了RDD和 ...

最新文章

  1. 【Leetcode】刷题之路4(python版)
  2. python 跳水板
  3. iDempiere = OSGi + ADempiere 一款ERPCRMSCM系统、助力中小企业发展
  4. pdf安装包_有么有pdf控件,不需要用户安装任何安装包直接打印的?
  5. cf 1060e 树形dp 树上任意两点的距离和
  6. CentOS 7 Flannel的安装与配置
  7. Spring学习(10)--- @Qualifier注解
  8. 大量的数据做字符串匹配_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法...
  9. C++ 将模板申明为友元
  10. [转载] python 等号 重载_python运算符重载2
  11. html+css实现淘宝右侧固定定位导航
  12. 金融风控实战——可解释人工智能技术
  13. 企业微信自定义应用页面授权过程
  14. 持续做正确的事,相信时间的复利
  15. ASP.NET 有哪些web服务器-
  16. java基础中的基础,简单中的简单
  17. 怎样用html制作歌词字幕,爱剪辑可以制作歌词字幕吗 教你用爱剪辑加歌词字幕的方法--系统之家...
  18. v-on:click(简写@click)绑定事件加括号和不加括号
  19. 影响搜索引擎排名因素包括几个
  20. 用C#识别图像中的文字_MODI OCR

热门文章

  1. java 需要返回类型_在Java中,当一个方法不需要返回数据时返回类型必须是
  2. 查看服务器的性能和使用状态(top,free,df)
  3. vscode eslint 格式化完之后,一个标签多行,看的头疼
  4. android顶部标题app_name,如何写一个app通用的title
  5. 安装erlang没有bin文件夹_Windows10有关jdk13.0.1的详细安装过程
  6. mysql 查询某个值非空_MySQL查询在单行中计算非空值
  7. uml系统设计期末大作业_梳理一下计算机期末大作业
  8. php修改学生信息代码_论导师和学生关于论文写作最大的信息不对称(一):从初稿到定稿到底要修改几遍?...
  9. php+select为空,SELECT时候,如何处理某字段空值?
  10. vue视频保存不下来_女子直播吃章鱼被“反杀”!拔不下来了,视频超痛……