SparkSQL(二)——RDD DF DS 相互转换

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){}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值