Spark DataFrame

最早在设计Spark的时候,其中一个很重要的目标就是给大数据生态圈提供基于通用编程语言的简单易用的API。Spark原本的RDD API通过函数式编程模式把分布式数据处理转换成分布式数据集。原本需要上千行用Hadoop MapReduce实现的代码,在Spark这个API上减少到了数十行。然后随着Spark的不断壮大,我们希望拥有更广泛的受众群体利用其进行分布式处理,不局限于“大数据”工程师。

新的DataFrame API在R和Python data frame的设计灵感之上,专门为了数据科学应用设计,具有以下功能特性:

  • 从KB到PB级的数据量支持;

  • 多种数据格式和多种存储系统支持;

  • 通过Spark SQL的Catalyst优化器进行先进的优化,生成代码;

  • 通过Spark无缝集成所有大数据工具与基础设施;

  • 为Python、Java、Scala和R语言(SparkR)API。

新API可以让Spark的初体验变得更加友好。

对于那些已经在使用的用户来说,这个API会让基于Spark的编程更加容易,同时其智能优化和代码生成也能帮助用户获得更好的性能。


在Spark中,DataFrame是一个以命名列方式组织的分布式数据集,等同于关系型数据库中的一个表。DataFrames可以由结构化数据文件转换而来,也可以从Hive中的表得来,以及可以转换自外部数据库或现有的RDD。一经构建,DataFrames就会为分布式数据处理提供一个指定的DSL。通过SparkSQL,还可以用SQL的方式操作DataFrames。


类似于RDD,DataFrame同样使用了lazy的方式。只有动作真正发生时,计算才会进行。

同时,所有的DataFrames也会自动的在集群上并行和分布执行。


DataFrame与生俱来就支持读取最流行的格式,包括JSON文件、Parquet文件和Hive表格。DataFrame还支持从多种类型的文件系统中读取,比如本地文件系统、分布式文件系统(HDFS)以及云存储(S3)。同时,配合JDBC,它还可以读取外部关系型数据库系统。此外,通过Spark SQL的外部数据源 API,DataFrames可以更广泛地支持任何第三方数据格式和数据源。值得一提的是,当下的第三方扩展已经包含Avro、CSV、ElasticSearch和Cassandra。


Spark中的DataFrames执行会被查询优化器自动优化。

在DataFrame上的计算开始之前,Catalyst优化器会编译操作,这将把DataFrame构建成物理计划来执行。

因为优化器清楚操作的语义和数据的结构,所以它可以为计算加速制定智能的决策。

在高等级上,这里存在两种类型的优化。

首先,Catalyst提供了逻辑优化,比如谓词下推(predicate pushdown)。优化器可以将谓词过滤下推到数据源,从而使物理执行跳过无关数据。在使用Parquet的情况下,更可能存在文件被整块跳过的情况,同时系统还通过字典编码把字符串对比转换为开销更小的整数对比。在关系型数据库中,谓词则被下推到外部数据库用以减少数据传输。

第二,为了更好地执行,Catalyst将操作编译为物理计划,并生成JVM bytecode,这些通常会比人工编码更加优化。例如,它可以智能地选择broadcast joins和shuffle joins来减少网络传输。其次,同样存在一些较为低级的优化,如消除代价昂贵的对象分配及减少虚拟函数调用。因此,我们认为现有的Spark项目迁移到DataFrames后,性能会有所改观。

同时,鉴于优化器为执行生成了JVM bytecode,Python用户将拥有与Scala和Java用户一样的高性能体验。




参考文献:

[0]  Spark新年福音:一个用于大规模数据科学的API——DataFrame

http://www.csdn.net/article/2015-02-17/2823997



你可能感兴趣的:(spark,dataFrame)