Dataframe Data Source API、show()

Dataframe Data Source API

我们来看一下

构建 Dataframe 的方式有哪些

读取数据源,可以读哪些数据

package com.shujia.sql

import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

object Demo2SourcceApi {
  def main(args: Array[String]): Unit = {

    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("api")
      .getOrCreate()

    //导入隐式转换
    import spark.implicits._
    //导入所有的函数
    import org.apache.spark.sql.functions._


    /**
      * 构建 Dataframe 的方式
      *
      * 1、读取csv格式的文件
      * csv -- 逗号分割符文件 -- 文本文件
      */

    val studentsDF: DataFrame = spark
      .read
      .format("csv")
      .option("sep", ",") //默认分割方式是逗号
      .schema("id STRING, name STRING , age INT ,gender STRING ,clazz STRING") // 这里类型大写是为了好看
      .load("data/students.txt")

    //studentsDF.show()


    /**
      * 2、读取一个json格式的文件
      * json 自带列名和类型,spark 会自动解析,不需要我们手动指定
      * json是一种结构化的通用的一种格式好解析,一般前端和后端传输的数据会使用json格式
      * 但是在我们大数据存储中一般不用json格式,因为会占用额外的空间
      */

    val jsonDF: DataFrame = spark
      .read
      .format("json")
      .load("data/students.json")

    //打印表结构
    //jsonDF.printSchema()

    //jsonDF.show()


    /**
      * 3、使用jdbc 构建df
      * JDBC -- 数据库对外提供的一种访问的协议 
      * spark 会继承数据库中的表结构,不需要手动指定
      * 注意需要在项目的 pom.xm 中添加MySQL的驱动(依赖)
      */

    val jdbcDF: DataFrame = spark
      .read
      .format("jdbc")
      .option("url", "jdbc:mysql://master:3306") //指定URL
      .option("dbtable", "bigdata.student") // 指定库名表名
      .option("user", "root")
      .option("password", "123456")
      .load()

    //jdbcDF.printSchema()
    //jdbcDF.show()


    /**
      * parquet 格式的文件,是一种压缩的格式,同时会自带列名,可以和hive完全兼容
      *
      */

    //生成一个 parquet 格式的文件
    /*studentsDF
      .write
      .mode(SaveMode.Overwrite)
      .format("parquet") //指定保存格式为parquet
      .save("data/parquet")*/

    /**
      * 4、读取parquet格式的文件
      *
      */
    val parquetDF: DataFrame = spark
      .read
      .format("parquet")
      .load("data/parquet")

    parquetDF.printSchema()
    parquetDF.show()


    /**
      *
      * 5、保存数据
      * json 格式和 parquet 格式不需要指定分割方式
      *
      */
    parquetDF
      .write
      .mode(SaveMode.Overwrite) //指定覆盖数据的模式
      .format("csv")
      .option("sep", "\t") // csv 格式的分割方式默认是逗号分割,可以自定义设置分割方式
      .save("data/csv")
  }
}

RDD 和 Dataframe 的相互转换

package com.shujia.sql

import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Row, SparkSession}

object Demo3RDDToDF {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("api")
      .getOrCreate()

    //导入隐式转换
    import spark.implicits._
    //导入所有的函数
    import org.apache.spark.sql.functions._


    //获取 sparkContext 
    val sc: SparkContext = spark.sparkContext

    val stdeuntRDD: RDD[String] = sc.textFile("data/students.txt")

    val stuRDD: RDD[(String, String, Int, String, String)] = stdeuntRDD.map(stu => {
      val split: Array[String] = stu.split(",")
      (split(0), split(1), split(2).toInt, split(3), split(4))
    })
    
    /**
      * 将RDD转换成DF ,  rdd的类型是一个元组, 转换的时候需要指定列名
      */

    val df: DataFrame = stuRDD.toDF("id", "name", "age", "gender", "clszz")

    //df.show()

    /**
      * DF 转换成RDD  类型是 ROW 类型, row 代表一行数据,可以使用列名获取列值
      */

    val rdd: RDD[Row] = df.rdd

    /**
      * 解析Row
      *
      */
    val tRDD: RDD[(String, String, Int, String, String)] = rdd.map(row => {
      val id: String = row.getAs[String]("id")
      val name: String = row.getAs[String]("name")
      val age: Int = row.getAs[Int]("age")
      val gender: String = row.getAs[String]("gender")
      val clazz: String = row.getAs[String]("clazz")
      (id, name, age, gender, clazz)
    })

    /**
      * 使用模式匹配
      */

    val trdd2: RDD[(String, String, Int, String, String)] = rdd.map {
      case Row(id: String, name: String, age: Int, gender: String, clazz: String) =>
        (id, name, age, gender, clazz)
    }

    trdd2.foreach(println)
  }
}

show()

package com.shujia.sql

import org.apache.spark.sql.{DataFrame, SparkSession}

object Demo4Show {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("api")
      .getOrCreate()

    val studentsDF: DataFrame = spark
      .read
      .format("csv")
      .option("sep", ",") //默认分割方式是逗号
      .schema("id STRING, name STRING , age INT ,gender STRING ,clazz STRING")
      .load("data/students.txt")

    // show 类似于 RDD 中的 take

    //默认取前20
    studentsDF.show()

    //指定获取的行数
    studentsDF.show(100)

    //完全显示数据
    //show中还有个参数 可以指定 当你的数据中有一条数据很长的时候 需不需要将其完全显示出来
    //truncate = true -- 默认是不完全显示 -- 为了输出结果格式好看
    studentsDF.show(100, false)
  }
}
posted @ 2022-03-11 21:18  赤兔胭脂小吕布  阅读(87)  评论(0编辑  收藏  举报