package com.zch.spark.sql.exercise
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
/**
* Author: zhaoHui
* Date: 2021/12/20
* Time: 16:21
* Description:
*/
object SparkSQL_Exercise_Demo04 {
def main(args: Array[String]): Unit = {
val spark = new SparkSession.Builder()
.appName("demo04")
.master("local[2]")
.getOrCreate()
// 导入SparkSession中隐式转换的包
import spark.implicits._
// 获取sc对象
val sc = spark.sparkContext
// 创建DF
// val df1 = spark.read.format(" ").load("")
// 创建RDD
val rdd1:RDD[(String,Int,Double)] = sc.makeRDD(List(
("amos", 18, 1.25),
("tom", 28, 125.0),
("jerry", 20, 3000.0)
))
// 将RDD转为DF
// 先将RDD转换为多元组作为泛型的RDD
// rdd.toDF(列名)
val df = rdd1.toDF("name", "age", "salary")
df.show()
// DF转为RDD
val rdd2:RDD[Row] = df.rdd
rdd2.map(x =>{
(x.get(0),x.get(1),x.get(2))
})
.foreach(println)
// RDD转为DS
// 一般情况下,创建案例类,并将RDD中的数据转换为案例类作为泛型
// 将对象的属性作为表中的字段
// 属性名就是字段名
// 属性类型就是字段的类型
// 由于使用类与表对象,不存在类型安全的问题
val rdd3 = rdd1.map(x => {
Person(x._1, x._2, x._3)
})
val ds:Dataset[Person] = rdd3.toDS()
ds.createTempView("t_person")
spark.sql("""select * from t_person""")
.show()
// DS 转 RDD
val rdd4 = ds.rdd
rdd4.map(x => {
(x.name,x.age,x.salary)
})
.foreach(println)
// DF 转 DS
// type DataFrame = Dataset[Row]
// Dataset[Person] = DataFrame[Row].as[Person]
// 将Row映射为Person
val ds1:Dataset[Person] = df.as[Person]
// DS转DF
// Dataset[Row] = Dataset[Person].toDF()
// 本质是将案例类解析为Row
val df1:DataFrame = ds1.toDF()
}
}
case class Person(name:String,age:Int,salary:Double){}
SparkSQL(二)——RDD DF DS 相互转换
于 2021-12-23 10:29:36 首次发布