一、Spark SQL与Dataframe
Spark SQL之所以是除Spark core以外最大和最受关注的组件的原因:
a) 能处理一切存储介质和各种格式的数据(你同时可以方便的扩展Spark SQL的功能来支持更多的数据类型,例如KUDO)
b)Spark SQL 把数据仓库的计算能力推向了一个新的高度。不仅是无敌的计算速度(Spark SQL比Shark快了一个数量级,Shark比Hive快了一个数量级),尤其是在tungsten成熟以后会更加无可匹敌。更为重要的是把数据仓库的计算复杂度推向了历史新高度(Spark后续推出的Dataframe可以让数据仓库直接使用机器学习、图计算等算法库来对数据仓库进行深度数据价值的挖掘)。
c)Spark SQL(Dataframe,DataSet)不仅是数据仓库的引擎,同时也是数据挖掘的引擎,更为重要的是Spark SQL是科学计算和分析的引擎。
d)后来的DataFrame让Spark SQL一举成为大数据计算引擎的技术上的霸主(尤其是在钨丝计划的强力支持下)。
e) Hive+Spark SQL+DataFrame
1) Hive负责廉价的数据存储
2) Spark SQL 负责高速的计算
3)DataFrame 负责复杂的数据挖掘
二、DataFrame与RDD
a)R和Python中都有DataFrame,Spark中的DataFrame从形式上看,最大的不同点就是其天生是分布式的;你可以简单的认为DataFrame是一个分布式的Table,形式如下:
Name | Age | Tel |
String | Int | Long |
String | Int | Long |
String | Int | Long |
String | Int | Long |
String | Int | Long |
String | Int | Long |
而RDD的形式如下:
Person |
Person |
Person |
Person |
Person |
Person |
RDD不知道数据行的属性,而DataFrame知道数据的列信息
b)RDD和DataFrame的根本差异
RDD以record为基本单位,Spark在处理RDD时无法优化RDD的内部细节,所以也就无法进行更深入的优化,这极大的限制了Spark SQL的性能。
DataFrame中包含了每个record的metadata信息,也就是说DataFrame优化时基于列内部优化,而不像RDD基于行进行优化。
三、Spark企业级最佳实践
阶段1 文件系统+C语言处理
阶段2 JavaEE + 传统数据库(扩展性太差,不支持分布式。即便有部分数据库支持分布式,但是因为事务一致性的关系,速度非常慢)
阶段3 Hive hive的计算能力有限,速度非常慢。
阶段4 Hive转向Hive+Spark SQL
阶段5 Hive+Spark SQL+DataFrame
阶段6 Hive+Spark SQL+DataFrame+DataSet