可以看出,Dataset在需要访问列中的某个字段时是非常方便的,然而,如果要写一些适配性很强的函数时,如果使用Dataset,行的类型又不确定,可能是各种case class,无法实现适配,这时候用DataFrame即Dataset[Row]就能比较好的解决问题
3. 转化:RDD、DataFrame、Dataset三者有许多共性,有各自适用的场景常常需要在三者之间转换
DataFrame/Dataset转RDD: val rdd1=testDF.rdd val rdd2=testDS.rdd RDD转DataFrame: import spark.implicits._ val testDF = rdd.map {line=> (line._1,line._2) }.toDF("col1","col2")一般用元组把一行的数据写在一起,然后在toDF中指定字段名
RDD转Dataset: import spark.implicits._ case class Coltest(col1:String,col2:Int)extends Serializable //定义字段名和类型 val testDS = rdd.map {line=> Coltest(line._1,line._2) }.toDS可以注意到,定义每一行的类型(case class)时,已经给出了字段名和类型,后面只要往case class里面添加值即可
Dataset转DataFrame:这个也很简单,因为只是把case class封装成Row
import spark.implicits._ val testDF = testDS.toDF DataFrame转Dataset: import spark.implicits._ case class Coltest(col1:String,col2:Int)extends Serializable //定义字段名和类型 val testDS = testDF.as[Coltest]这种方法就是在给出每一列的类型后,使用as方法,转成Dataset,这在数据类型是DataFrame又需要针对各个字段处理时极为方便
《每日五分钟搞定大数据》原创系列,每周不定时更新。评论不能及时回复可直接加公众号提问或交流,知无不答,谢谢 。