零基础入门 Spark
吴磊
前 FreeWheel 机器学习研发经理
19171 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
零基础入门 Spark
15
15
1.0x
00:00/00:00
登录|注册

14 | 台前幕后:DataFrame与Spark SQL的由来

你好,我是吴磊。
在上一讲,结合“小汽车倍率分析”的例子,我们学习了在 Spark SQL 子框架下做应用开发的一般模式。我们先是使用 SparkSession 的 read API 来创建 DataFrame,然后,以 DataFrame 为入口,通过调用各式各样的算子来完成不同 DataFrame 之间的转换,从而进行数据分析。
尽管我们说过,你可以把 DataFrame 看作是一种特殊的 RDD,但你可能仍然困惑 DataFrame 到底跟 RDD 有什么本质区别。Spark 已经有了 RDD 这个开发入口,为什么还要重复造轮子,整出个 DataFrame 来呢?
相信学完了上一讲,这些问题一定萦绕在你的脑海里,挥之不去。别着急,今天我们就来高屋建瓴地梳理一下 DataFrame 的来龙去脉,然后再追本溯源,看看帮助 DataFrame 崭露头角的幕后大佬 Spark SQL 又是怎么回事儿。

RDD 之殇:优化空间受限

在 RDD 算子那一讲(第 3 讲),我们曾经留过一道思考题,像 map、mapPartitions、filter、flatMap 这些算子,它们之间都有哪些共性?
今天,我们从一个全新的视角,来重新审视这个问题。先说结论,它们都是高阶函数(Higher-order Functions)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spark SQL与DataFrame技术特点深度剖析 DataFrame作为Spark SQL子框架下的一种数据表示形式,相较于RDD,携带数据模式,提供明确的类型信息,从而提升数据存储与访问效率。尽管DataFrame的算子表达能力较弱,但每个算子的计算逻辑都是确定的,为Spark引擎的内核优化打开了全新的空间。文章着重介绍了Spark SQL作为幕后英雄,负责优化引擎内核的关键角色。通过Catalyst优化器和Tungsten两个核心组件,Spark SQL实现了对DataFrame的优化。Catalyst优化器负责创建并优化执行计划,而Tungsten则用于优化数据结果与可执行代码。通过对这些核心组件的介绍,读者可以更好地理解Spark SQL的优化过程。整体而言,本文通过对DataFrame与Spark SQL的技术特点进行深入剖析,为读者提供了对这一技术领域的全面了解。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《零基础入门 Spark》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 大叮当
    老师您好,请教您两个问题: 1、除了dataframe,还有个dataset,那dataframe和dataset两种格式,在执行的时候有没有效率、性能这方面差异呢?您更推荐哪种呢 2、Dataset<Row>和Dataset<具体类型>比如Dataset<Person>,这两种是不是性能上也有差异呢? 谢谢

    作者回复: 好问题~ Dataset咱们一直没讲,先说结论。在执行效率上,Dataset与DataFrame是一样的、一致的,没有区别。他们都能共享Spark SQL提供的性能红利,所以说,从性能的角度,不用担心。包括你提到的Dataset<Row>和Dataset<具体类型>之间,性能上也没有差异。 差异主要在开发效率上,对于Dataset<具体类型>,开发者需要定义明确的case class,从而让Spark SQL知道每个字段的具体类型。这其实就涉及到一个开发效率的问题,为什么这么说呢? 当应用中的数据集较多的时候,或者说当你需要创建多个Dataset的时候,你都需要定义相应的case class。其实,定义case class还是或多或少有点麻烦的。当然,不同开发者偏好不同,也有喜欢用Dataset开发的。不过,通常来说,DataFrame会来的更直接,简单、易用,所以通常来说DataFrame用的比较多~

    2021-10-14
    14
  • 米哈游牛浚亲
    想请问下,DataFrame API 最终是都会转化成codegen的生成代码吗?还是可选生成RDD或codegen呢

    作者回复: 这个不是可选的哈,在Spark SQL框架下,每个执行阶段的代码,Tungsten都会尝试用whole stage code gen捏合到一起,生成一份代码。然后把捏合之后的代码,丢给Spark Core去执行

    2021-10-20
    3
  • 子兮
    老师, spark graphX 也是会把一个stage 的算子合成一个函数执行,但是grapX 是没有用到Tungsten的,所以这种优化方式不应该是spark core 在做的吗?

    作者回复: 确实有把Tungsten归类到Spark Core的范畴的,其实我觉得都OK,是归类到Spark Core还是Spark SQL,其实这个倒没那么重要,重要的是,大家理解、吃透Tungsten的各种优化机制就好了哈~

    2021-11-22
    1
  • legend
    下面这段话中不再是透明的是不是说反了?应该是“不再是不透明的”吧? 这些计算逻辑对 Spark 来说,不再是透明的,因此,Spark 可以基于启发式的规则或策略,甚至是动态的运行时信息,去优化 DataFrame 的计算过程。
    2023-03-08归属地:中国香港
    1
    2
  • Nicky
    请问RDD比Dataframe有什么样的优势吗?课程中有提到RDD 算子多采用高阶函数,表达能力强,能灵活地设计并实现业务逻辑。老师可以详细讲一下RDD的价值吗?
    2022-12-18归属地:广东
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部