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