本篇文章将介绍Spark SQL中的DataFrame,关于DataFrame与RDD的区别,可以参见这篇博客:DataFrame与RDD的区别
DataFrame的由来
DataFrame是Spark SQL里面非常核心的一个类,DataFrame这个词不是Spark SQL里有的,是从其它地方借鉴过来的:在 R语言里是有DataFrame这个概念的,但是R语言是单机处理的,也就是说对于数据量大的情况是没有办法进行处理的。如果使用MapReduce/Spark Core来进行处理,需要了解编程模型,因此会带来很大的门槛,并不是所有人都能搞的定的,而R语言是简单的,但是又因为只能单机跑:
MapReduce/Spark Core | Threshold |
---|---|
R | One machine |
两者都有限制,不能做到很好的水平的横向的扩展,基于这种情况,在Spark里面推出了DataFrame这个概念
官网解读
官网:http://spark.apache.org/docs/latest/sql-programming-guide.html#datasets-and-dataframes
官网的介绍:
DataSet
一个DataSet表示的是一个分布式的集合的数据(与RDD的概念有点类似);DataSet是一个新的接口在Spark 1.6里添加的。对比RDD来说,DataSet所能带来的好处:- strong typing(强类型)
- ability to use powerful lambda functions(能够提供一个强有力的lambda函数)
上述所说的两点,是能够被Spark SQL底层的优化引擎进行优化的。一个DataSet能够从 JVM对象 中被构建出来,然 后手动的通过一些函数式的transformation(map,flatMap,filter等),一个数据集只要经过这些转换之后,就会变成另外一个数据集,这点是与RDD一样的。DataSet目前仅能够支持Scala、Java进行编程,Python它现在还不能支持DataSet的API,这是因为Python中的一些特性所决定的;R也不能支持DataSet的API
DataFrame
DataFrame就是一个DataSet,被组织成带名字的列
那么DataFrame是什么呢?从概念角度来说,我们可以理解它为在RDBMS中的一张表或者说是在R/Python中的DataFrame但是,它在底层做了更好的优化DataFrame能够被构建通过:- structured data files
- tables in Hive
- external databases,
- existing RDDs
将上述这些转换成DataFrame之后,我们就可以使用DataFrame中非常非常多的算子进行操作了,就很方便了
DataFrame API支持Scala,Java,Python,R
在Scala和Java里面,一个DataFrame代表了一个DataSet,但是它的类型是一个Row类型
在Scala API里面,你就认为是Dataset[Row]的一个别名:DataFrame = Dataset[Row]
几个重要的点
DataFrame有:
column name 列名称
column type 列类型
column value 列值
有了这些,就可以使用列名,或者各方面进行操作DataFrame == Table ==> 相当于你对DataFrame做操作,和对表做操作是一样的;底层做了很多优化的
DataFrame = Dataset[Row]
提供了强有力的算子/API:
select,filter ……
BigData:
使用dataframe api来进行开发,有种感觉自己在开发单机的应用程序,但是可以运行在spark之上
达到small data ==> distribute,从小的数据集处理,直接到分布式的处理,开发的时候是感觉不到的,为开发Spark SQL应用程序带来了非常大的方便
SchemaRDD:
Spark 1.3 版本之前是这样称呼的,之后才有的DataFrame;其实SchemaRDD不就是把一个Schema作用在RDD之上嘛,其实本质上和DataFrame没有区别
- 在1.3版本出来了DataFrame
- 在1.6版本出来了DataSet