Spark SQL
1、相应于Hive: SQL —> MapReduce
2、底层依赖RDD: SQL —> RDD
一、Spark SQL基础
1、什么是Spark SQL?
参考官网
2、核心概念:DataFrame(表)= Schema(表结构) + Data(表数据)
(*)就是表,是Spark SQL对结构化数据的抽象
(*)DataFrame表现形式就是:RDD
1.6后,新的概念:DataSet(类似DataFrame)
3、创建表:DataFrame
(*)测试数据:员工表emp.csv、部门表dept.csv
数据 : 7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30
(方式一)使用case class定义表
(1) 定义case class代表表的结构schema
case class Emp(empno:Int,ename:String,job:String,mgr:String,hiredate:String,sal:Int,comm:String,deptno:Int)
(2) 导入emp.csv文件(导入数据)
val lines = sc.textFile("/root/temp/csv/emp.csv").map(_.split(","))
(3) 生成表: DataFrame
val allEmp = lines.map(x=>Emp(x(0).toInt,x(1),x(2),x(3),x(4),x(5).toInt,x(6),x(7).toInt))
由allEmp直接生成表
val empDF = allEmp.toDF
IDEA实现方式:
package dataframe
import org.apache.spark.sql.SparkSession
import org.apache.spark.{SparkConf, SparkContext}
object DataFrameDemo {
def main(args: Array[String]): Unit = {
//创建一个Context对象
val conf = new SparkConf().setAppName("MyJdbcDriverLogCount").setMaster("local");
val sc = new SparkContext(conf)
val lines = sc.textFile("D:\\BaiduNetdiskDownload\\emp.csv").map(_.split(","))
//把每行数据映射到Emp的类上,把数据和Schema关联
val allEmp = lines.map(x=>Emp(x(0).toInt,x(1),x(2),x(3),x(4),x(5).toInt,x(6),x(7).toInt))
val spark= SparkSession.builder()
.appName("MyJdbcDriverLogCount")
.config("spark.some.config.option", "some-value")
.getOrCreate()
//import implicit DF,DS
import spark.implicits._
val empDF = allEmp.toDF()
empDF.show()
}
}
case class Emp(empno:Int,ename:String,job:String,mgr:String,hiredate:String,sal:Int,comm:String,deptno:Int)
(4) 操作: DSL语句
empDF.show ----> select * from emp
empDF.printSchema ----> desc emp
(方式二)使用SparkSession对象
(1) 什么是SparkSession?
查看启动spark shell的日志:Spark session available as 'spark'
从2.0以后,Spark的新的访问接口:提供统一的访问方式
通过SparkSession可以访问Spark所有的模块
def createDataFrame(rowRDD: RDD[Row], schema: StructType): DataFrame