RDD、DataFrame、DataSet互轉
如果需要RDD與DS或者DF之間操作,那麼都需要引入 import spark.implicits._ 【spark不是包名,而是sparkSession物件的名稱】
1、RDD 《-》 DataFrame
1、RDD -》 DataFrame (確定Schema)
a、直接手動確定:
peopleRDD.map{x =>
val para = x.split(",")
(para(0), para(1).trim.toInt)
}.toDF("name","age")
b、通過反射確定 (利用case class 的功能)
case class People(name:String, age:Int)
peopleRdd.map{ x =>
val para = x.split(",")
People(para(0),para(1).trim.toInt)
}.toDF
c、通過程式設計方式來確定
1、準備Scheam
val schema = StructType( StructField("name",StringType):: StructField("age",IntegerType)::Nil )
2、準備Data 【需要Row型別】
val data = peopleRdd.map{ x =>
val para = x.split(",")
Row(para(0),para(1).trim.toInt)
}
3、生成DataFrame
val dataFrame = spark.createDataFrame(data, schema)
2、DataFrame -》 RDD
dataFrame.rdd 即可, 返回的是 RDD[Row]
2、RDD 《-》 DataSet
1、RDD -》 DataSet (case class 確定schema)
case class People(name:String, age:Int)
peopleRDD.map{x =>
val para = x.split(",")
People(para(0), para(1).trim.toInt)
}.toDS
2、DataSet -》 RDD
dataSet.rdd 即可, 返回的是 RDD[People]
3、DataFrame 《-》 DataSet
1、DataSet -》 DataFrame
dataSet.toDF 即可,直接複用case class的名稱
2、DataFrame -》 DataSet (Scheam需要藉助case class) 【DF的列名要和 case class的列名一致。】
case class People(name:String, age:Int)
dataFrame.as[People] 即可。