Spark SQL 是 Spark 用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame 并且作为分布式 SQL 查询引擎的作用。
为什么要学习 Spark SQL?我们已经学习了 Hive,它是将 Hive SQL 转换成MapReduce 然后提交到集群上执行,大大简化了编写 MapReduce 的程序的复杂性,由于 MapReduce 这种计算模型执行效率比较慢。所以 Spark SQL 的应运而生,它是将 SparkSQL 转换成 RDD,然后提交到集群执行,执行效率非常快!同时 Spark SQL 也支持从Hive 中读取数据。
Spark SQL 的特点:
DataFrame
DataFrame 是组织成命名列的数据集。它在概念上等同于关系数据库中的表,但在底层具有更丰富的优化。DataFrames 可以从各种来源构建,
例如:
结构化数据文件
hive 中的表
外部数据库或现有 RDDs
DataFrame API 支持的语言有 Scala,Java,Python 和 R。
什么是 SparkSession
Apache Spark 2.0 引入了 SparkSession,其为用户提供了一个统一的切入点来使用 Spark 的各项功能,并且允许用户通过它调用 DataFrame 和 Dataset 相关 API来编写 Spark 程序。最重要的是,它减少了用户需要了解的一些概念,使得我们可以很容易地与 Spark 交互。在 2.0 版本之前,与 Spark 交互之前必须先创建 SparkConf 和 SparkContext。然而在 Spark 2.0 中,我们可以通过 SparkSession 来实现同样的功能,而不需要显式地创建 SparkConf, SparkContext 以及 SQLContext,因为这些对象已经封装在SparkSession 中。
package com.ccj.pxj.zq
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}
object EMPDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("pxj").setMaster("local[4]")
val spark= SparkSession.builder().config(conf).getOrCreate()
val data: Dataset[String] = spark.read.textFile("data/emp.csv")
import spark.implicits._
val frame: DataFrame = data.map(x => {
val datas: Array[String] = x.split(",")
val empno = datas(0).toInt
val ename = datas(1)
val job = datas(2)
val mgr = datas(3)
val hiredate = datas(4)
val sal = datas(5).toInt
val comm = datas(6)
val deptno = datas(7).toInt
Emp(empno, ename, job, mgr, hiredate: String, sal, comm, deptno)
}).toDF()
frame.show()
spark.stop()
}
}
case class Emp(empno:Int,ename:String,job:String,mgr:String,hiredate:String,sal:Int,comm:String,deptno:Int)
package com.ccj.pxj.zq
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
object ReadJDBCSparkSQLYouhua {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("pxj").setMaster("local[4]")
val session = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
val frame: DataFrame = session.read.format("jdbc")
.option("url", "jdbc:oracle:thin:@192.168.25.50:1521/orcl")
.option("dbtable", "emp")
.option("user", "scott")
.option("password", "lenovo")
.load()
frame.registerTempTable("sc")//优化一:注册成表
val k=session.sql("select * from sc")
//缓存起来
session.sqlContext.cacheTable("sc")
val k1=session.sql("select * from sc")
k.show()
println("----------------------------------------------------")
k1.show()
}
}
package com.ccj.pxj.zq
import java.util.Properties
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
object ReadJDBCSparkMysql {
def main(args: Array[String]): Unit = {
val pxj = new SparkConf().setMaster("local[4]").setAppName("pxj")
val session = SparkSession.builder().config(pxj).enableHiveSupport().getOrCreate()
val frame = session.read.format("jdbc")
.option("url", "jdbc:mysql://localhost:3306/mrtest?characterEncoding=UTF-8")
.option("dbtable", "dept")
.option("user", "root")
.option("password", "")
.load()
frame.show()
println("-----------------------------------------------------------------------------------------------------")
val properties = new Properties()
properties.setProperty("user","root")
properties.setProperty("password","")
val frame1 = session.read.jdbc("jdbc:mysql://localhost:3306/mrtest?characterEncoding=UTF-8","dept",properties)
frame1.show()
session.stop()
}
}
package com.ccj.pxj.zq
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
object DataSetsonJson {
def main(args: Array[String]): Unit = {
val pxj = new SparkConf().setMaster("local[4]").setAppName("pxj")
val session = SparkSession.builder().enableHiveSupport().config(pxj).getOrCreate()
val sc = session.sparkContext
import session.implicits._
val frame: DataFrame = session.read.json(sc.parallelize("""{"gender": "Male", "name": "Tom"}""" :: Nil))
frame.as[Person].show()//将DataFrame 转成DataSet
println("************************************************")
val persons: Array[Person] = frame.as[Person].collect()
}
}
case class Person(name: String, gender: String)
package com.ccj.pxj.zq
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
object DataSetDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("pxj").setMaster("local[4]")
val session = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
import session.implicits._
val dS = Seq(MyData("1","pxj"),MyData("2","wfy")).toDS
dS.show()
}
}
case class MyData(a:String,b:String)
作者:pxj(潘陈)
日期:2020-02-05 凌晨1:01:30