翻译:Apache Spark : RDD vs DataFrame vs Dataset

在Spark 2.0 Release中,官方提供了3种数据抽象结构供使用:RDD,DataFrame and DataSet。

对于新手来说,可能会对理解三种结构间的关系和决定使用不使用哪一种感到迷惑。本文会详细介绍区别。

简要综述

在分开讨论前,来一个简述,三种结构产生顺序如下:

RDD (Spark1.0) —> Dataframe(Spark1.3) —> Dataset(Spark1.6)

RDD是最老的从1.0版本就可用的,Dataset是最新的从1.6版本可用的。给定同样数据,三种抽象结构都会计算并得出相同的结果给用户。但是他们在性能上和计算方式上有所不同。

RDD让我们决定如何做,这限制了Spark在底层处理时的优化,而在处理底层时,dataframe/dataset让我们决定做什么,而把如何计算全部交给了Spark。

让我们花两分钟理解如何做做什么的区别。

相比RDD,Dataframe带来了一个主要的性能提升,同时也带来了一些缺点,这导致Dataset的发展,它是RDD和Dataframe最好的统一。未来,Dataset最终会替代RDD和Dataframe成为Spark用户在编写代码时唯一要考虑的API。让我们逐个来理解。

RDD:

  • Spark编译block。不管我们使用Dataframe还是Dataset,内部最终会使用RDD计算。

  • RDD是延迟评估(加载)的可以暴露给lambda函数的不可变并行对象的集合。

  • RDD最好的部分是它是简单的。它提供了类似面向对象风格的API。我们可以从数据源加载任何数据,将其转化为RDD并且存进内存中计算结果。RDD可以被轻易缓存如果相同数据集需要被重复计算。

  • 但是RDD的缺点是性能瓶颈。作为缓存至jvm内存的对象,RDD包含GC和Java序列化,这在数据量巨大时会带来昂贵开销。

Dataframe:

  • Dataframe是一个抽象结构,它提供了数据的schema视图。这意味着它给我们提供了像带有列和类型信息的数据视图,我们可以认为在Dataframe中的数据就像是数据库中的表一样。

  • 与RDD类似,Dataframe的执行也是延迟触发的。

  • 比RDD提供了巨大的性能提升,因为有以下两个强有力的特性:

    • 1. 自定义内存管理 (又名 Project Tungsten)

    数据会用二进制格式存储在非堆内存。这节省了大量内存。并且在这里没有垃圾回收。由于已经提前知晓数据的schema并且用二进制存储也很高效,昂贵的Java序列化开销也可以避免。

    • 2.优化的执行计划(又名 Catalyst Optimizer)

    查询计划是在用Spark Catalyst Optimizer执行时候生成的。优化过的执行计划最终的执行只会在RDD内部,而且对用户完全隐藏。

    • 在上面的查询中,filter是在join上层调用的,这是个有代价的shuffle操作。逻辑上的执行计划可以看到,而在优化的执行计划中,执行计划是被下推到join之前做的,它可以平衡datasource的负载能力,并且将过滤器下推至datasource就可以将过滤器应用在磁盘层面而不是在内存中做过滤操作(这在直接使用RDD时是不可能的)。所以filter方法可以高效执行就像数据库查询的WHERE子句一样。并且,在优化的数据源如parquet,如果Spark发现你只需要读少量列就可以计算出结果的话,它只会去读和获取parquet的这些列,同时节省了磁盘IO和内存。

    • Dataframe缺点:缺乏类型安全。作为开发者,不会使用Dataframe因为它看起来对开发者不是那么友好。通过string的name去引用attribute意味着编译时不安全。在运行可能会失败。另外其API看起来结构不好。

    • Dataframe实例: 2种方式定义: 1. Expression BuilderStyle 2. SQL Style[图片上传失败...(image-e6d1b-1533828571323)] 如上所述,如果我们尝试使用一些schema中没有出现的列,我们会在运行时候出错。例如,我们尝试访问salary,而schema中只有name和age。

Dataset:

  • 它是Dataframe的扩展,是尝试去提供RDD和Dataframe二者结合最好的抽象结构。

  • 面向对象的风格,开发者友好,像RDD一样编译时安全,并且性能又像Dataframe一样有Catalyst optimizer 和 custom memory management

  • Dataset是如何超过Dataframe的?一个新特性:Encoders

  • Encoders是一个在JVM对象和非堆自定义内存二进制数据之间的接口。

  • Encoders生成二进制代码来跟非堆数据交互,并且提供有需访问给独立的参数而不是对整个对象反序列化。

  • case class用于定义Dataset中的数据schema结构,使用case class,可以很轻易用Dataset。case class中不同参数的名字是跟Dataset中的filed有映射关系的。它给人一种使用RDD但是底层使用的是Dataframe的感觉。

  • Dataframe实际上是被当作通用row对象的dataset来看待的。DataFrame=Dataset[Row] 。所以我们可以在任何时候把Dataframe转化成Dataset通过调用“as”方法。如:

    df.as[MyClass]

重点记得无论是Dataset还是Dataframe,内部执行都是用RDD的,但不同的是,用户不用写代码来创建RDD集合也不用控制这些RDD。RDD会在执行计划的最后一步,在优化以后生成。这是文章开头说的,RDD让我们决定如何做,dataframe/dataset让我们决定做什么

所有这些优化都是可行的因为数据是结构化的并且Spark事先知道数据的schema。所以它可以使用所有很棒的特性如tungsten非堆二进制内存自定义管理,catalyst优化器和encoders来获取性能提升,在在只使用RDD的情况下是不可能实现的。

结论:

简而言之,Spark将非结构化计算移至结构化计算因为这样可以允许多种性能优化。Dataframe是结构化计算的第一步,但是缺乏友好。最终Dataset统一了Dataframe和RDD,带来了最好的抽象结构。走在前面的开发者只需要考虑Dataset因为Dataframe和RDD不推荐使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容