1. 程式人生 > >RDD、DataFrame、DataSet互轉

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]  即可。