查看: 180|回复: 1

且谈Apache Spark的API三剑客:RDD、DataFrame和Dataset

[复制链接]
论坛徽章:
37
R研习者中级
日期:2016-10-20 16:44:19matlab徽章
日期:2017-11-30 15:58:00Kaggle徽章
日期:2017-12-25 17:28:27Kaggle徽章
日期:2017-12-25 17:28:34NLP徽章
日期:2017-12-25 17:31:02Julia徽章
日期:2017-12-25 17:39:24时间序列分析徽章
日期:2018-02-08 16:18:26金融徽章
日期:2018-03-01 16:43:15Tensorflow徽章
日期:2018-03-01 16:44:34计算徽章
日期:2018-03-19 15:04:31python徽章
日期:2018-03-23 10:45:53Hadoop研习者中级
日期:2018-04-02 15:22:57
发表于 2018-6-10 23:03 | 显示全部楼层 |阅读模式

Java Spark 分布式 JVM Scala API

http://www.infoq.com/cn/articles/three-apache-spark-apis-rdds-dataframes-and-datasets

最令开发者们高兴的事莫过于有一组API,可以大大提高开发者们的工作效率,容易使用、非常直观并且富有表现力。Apache Spark广受开发者们欢迎的一个重要原因也在于它那些非常容易使用的API,可以方便地通过多种语言,如ScalaJava、Python和R等来操作大数据集。

在本文中,我将深入讲讲Apache Spark 2.2以及以上版本提供的三种API——RDD、DataFrame和Dataset,在什么情况下你该选用哪一种以及为什么,并概述它们的性能和优化点,列举那些应该使用DataFrame和Dataset而不是RDD的场景。我会更多地关注DataFrame和Dataset,因为在Apache Spark 2.0中这两种API被整合起来了。

这次整合背后的动机在于我们希望可以让使用Spark变得更简单,方法就是减少你需要掌握的概念的数量,以及提供处理结构化数据的办法。在处理结构化数据时,Spark可以像针对特定领域的语言所提供的能力一样,提供高级抽象和API。

弹性分布式数据集(Resilient Distributed Dataset,RDD)
从一开始RDD就是Spark提供的面向用户的主要API。从根本上来说,一个RDD就是你的数据的一个不可变的分布式元素集合,在集群中跨节点分布,可以通过若干提供了转换和处理的底层API进行并行处理。

在什么情况下使用RDD?
下面是使用RDD的场景和常见案例:

你希望可以对你的数据集进行最基本的转换、处理和控制;
你的数据是非结构化的,比如流媒体或者字符流;
你想通过函数式编程而不是特定领域内的表达来处理你的数据;
你不希望像进行列式处理一样定义一个模式,通过名字或字段来处理或访问数据属性;
你并不在意通过DataFrame和Dataset进行结构化和半结构化数据处理所能获得的一些优化和性能上的好处;
Apache Spark 2.0中的RDD有哪些改变?
可能你会问:RDD是不是快要降级成二等公民了?是不是快要退出历史舞台了?

答案是非常坚决的:不!

而且,接下来你还将了解到,你可以通过简单的API方法调用在DataFrame或Dataset与RDD之间进行无缝切换,事实上DataFrame和Dataset也正是基于RDD提供的。

DataFrame
与RDD相似,DataFrame也是数据的一个不可变分布式集合。但与RDD不同的是,数据都被组织到有名字的列中,就像关系型数据库中的表一样。设计DataFrame的目的就是要让对大型数据集的处理变得更简单,它让开发者可以为分布式的数据集指定一个模式,进行更高层次的抽象。它提供了特定领域内专用的API来处理你的分布式数据,并让更多的人可以更方便地使用Spark,而不仅限于专业的数据工程师。

在我们的Apache Spark 2.0网络研讨会以及后续的博客中,我们提到在Spark 2.0中,DataFrame和Dataset的API将融合到一起,完成跨函数库的数据处理能力的整合。在整合完成之后,开发者们就不必再去学习或者记忆那么多的概念了,可以通过一套名为Dataset的高级并且类型安全的API完成工作。

Dataset
如下面的表格所示,从Spark 2.0开始,Dataset开始具有两种不同类型的API特征:有明确类型的API和无类型的API。从概念上来说,你可以把DataFrame当作一些通用对象Dataset[Row]的集合的一个别名,而一行就是一个通用的无类型的JVM对象。与之形成对比,Dataset就是一些有明确类型定义的JVM对象的集合,通过你在Scala中定义的Case Class或者Java中的Class来指定。

回复

使用道具 举报

新浪微博达人勋 xenron  实名认证
论坛徽章:
119
pyspark徽章
日期:2018-09-06 14:49:50python徽章
日期:2018-09-13 15:34:42金融徽章
日期:2018-09-13 15:38:55
发表于 2018-8-21 23:37 | 显示全部楼层
spark主要是面向分布式计算,rdd是基础,其他的数据类型,都是衍生产品
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2018-9-21 16:34 , Processed in 0.141021 second(s), 31 queries .