Spark SQL(RDD、DataFrame 、DataSet 相互转换)
一、Spark SQL数据抽象
SparkCore的数据抽象:RDD
SparkStreaming的数据抽象:DStream,底层是RDD
SparkSQL的数据抽象:DataFrame和DataSet,底层是RDD
1、DataFrame
DataFrame = RDD - 泛型 + Schema约束(指定字段名和类型)+ SQL操作 + 优化
DataFrame 就是在RDD的基础之上做了进一步的封装,支持 SQL操作
DataFrame 就是一个分布式表
2、DataSet
DataSet = DataFrame + 泛型
DataSet = RDD + Schema约束(指定字段名和类型)+ SQL操作 + 优化
DataSet 就是在RDD的基础之上做了进一步的封装,支持 SQL操作
DataSet 就是一个分布式表
二、实战示例
1、加载数据成为分布式表
package com.jiang.sparksql
import org.apache.spark.SparkContext
import org.apache.spark.sql.{
DataFrame, SparkSession}
object Demo01 {
def main(args: Array[String]): Unit = {
//TODO 0.准备环境
val spark: SparkSession = SparkSession.builder().appName("sparksql").master("local[*]").getOrCreate()
val cs: SparkContext = spark.sparkContext
cs.setLogLevel("WARN")
//TODO 1.加载数据
val resultTxt: DataFrame = spark.read.text("data/input/wc.txt")
val resultJson: DataFrame = spark.read.json("data/input/package.json")
val resultCsv: DataFrame = spark.read.csv("data/input/testcsv.csv")
//TODO 2.处理数据
//TODO 3.输出结果
resultTxt.printSchema()
resultJson.printSchema()
resultCsv.printSchema()
resultTxt.show()
resultJson.show()
resultCsv.show()
//TODO 3.关闭资源
spark.stop()
}
}
2、将RDD转为DataFrame
(1)使用样例类
package com.jiang.sparksql
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{
DataFrame, SparkSession}
object Demo02 {
def main(args: Array[String