之前在写Spark Driver程序的时候,因为使用的DataFrame来进行的相关操作,所以今天就总结一下用到的一些东西,同时也分享一下自己遇到的一些问题,让新人能够快速的解决相关的问题.虽然最新的Spark Sql把DataFrame变成了DataSet,但是DataFrame和DataSet这两个操作其实都类似。
DataFrame
DataFrame其实就是带了元数据的RDD,大家在学习Spark之前肯定了解RDD,RDD其实是一个抽象数据块集合。DataFrame就是带了列的RDD,简单粗暴的理解。一般使用的时候,先初始化SparkContext,然后在初始化SQLContext,然后通过初始化的SQLContext来进行读取外部的数据源,具体可以调用sqlContext.read.后面的方法,下面的代码只是读取了json文件的数据,你也可以使用sqlContext.read.别的方法来进行读取数据。
val context = new SparkContext(new SparkConf().setAppName("hello"))]
val sqlContext = new SQLContext(context)
val dataFrame : DataFrame = sqlContext.read.json("你的json路径")
DataFrame操作
在进行了读取外部数据源到DataFrame之后,那么就可以进行相应的操作了。了解DataFrame操作的API的方法就是去Spark官网查看API文档来进行代码的编写。毕竟官方文档才是最权威的教程。
select操作
当我们有了最初的DataFrame之后,我们有想之查看某几列的数据,这时我们就可以使用select这个函数来进行选取。比如下面的代码:
val selecstData = dataFrame .select("age","name")
select.show
上面的代码返回的就是age和name这两例的数据,最后通过DataFrame的show方法,来进行数据的显示。
agg操作
DataFrame的agg函数操作,其实就是你对数据的一些聚合函数的操作,比如求最大值,求最小值,平均数等等一些操作。
where操作
其实在使用DataFrame的where函数的时候,就类似你使用sql语句中的where语句。where函数是根据你的表达式,来进行数据筛选。它的返回值也是一个DataFrame。但是在使用之前,必须import sqlContext.implicits._ 隐式转换。我之前使用的时候,老是代码错误,最后才知道这个原因.
val data = dataFrame.where($"age">18)
遇到的问题
当我们进行 dataframe进行map,fielter,where操作时,类要继承
java.io.Serializable在代码中不能使用$ ,解决方法:import sqlContext.implicits._
引入隐式转换当我们想多个DataFrame合并为一个DataFrame时,只能重新将这些数据读取出来,重新生成一个DataFrame.具体方法,官网的demo中有相关的例子。