1.sparkSQL是什么
sparkSQL主要是为了降低一些数据工作者使用门槛的降低,让一些科学家去编写一大堆代码是不现实的,所以产生了SQL查询模式
2.sparkSQL应用场景
老的sparkcore的入口API是SparkContext其功能主要是处理非结构化数据和半结构化数据而目前时代下数据源一般都是类似mysql,hbase等结构化数据源,所以spark团队专门针对需求设计了SparkSession入口API,用于实现结构化数据清洗,查询等一系列操作,而且他还兼容老的sparkContext的所有功能
3.sparkSQL编写流程
import org.apache.spark.sql.SparkSession
import org.apache.spark.{SparkConf, SparkContext, sql}
import org.junit.Test
class sparkSQLDemo {
@Test
def sqlDemo: Unit ={
//创建对象
val spark = new sql.SparkSession.Builder()
.appName("sql")
.master("local[4]")
.getOrCreate()
import spark.implicits._ //隐式转换
val sourceRdd = spark.sparkContext.parallelize(Seq(Person("zhangsan",15),Person("lisi",20)))
val PersonDS: Dataset[Person] = sourceRdd.toDS()
val resultDS = PersonDS.where('age > 10)
.where('age < 20)
.select('name)
.as[String]
resultDS.show()
}
}
case class Person(name:String,age:Int)
4.DataFrame和DataSet
DS是命令式的API 而DF是声明式(sql)的API
@Test
def sqlDemo2: Unit ={
val spark = new sql.SparkSession.Builder()
.appName("sql")
.master("local[4]")
.getOrCreate()
import spark.implicits._ //隐式转换
val sourceRdd = spark.sparkContext.parallelize(Seq(Person("zhangsan",15),Person("lisi",20)))
val df: DataFrame = sourceRdd.toDF()
df.createOrReplaceGlobalTempView("person")
val resultdf = spark.sql("select name from where age>10 and age<20")
resultdf.show()
(1)DataSet特点
DataSet是一个有数据类型的数据容器,提供了结构化查询API和类RDD的命令式
import org.apache.spark.{SparkConf, SparkContext, sql}
import org.junit.Test
class sparkSQLDemo {
@Test
def dataSet1(): Unit ={
//1.创建sparkSession
val spark = new sql.SparkSession.Builder()
.master("local[6]")
.appName("dataset1")
.getOrCreate()
//2.导入隐式转换
import spark.implicits._
//3.两种创建ds方式
//3.1第一种创建ds方式
val sourceRDD = spark.sparkContext.parallelize(Seq(Person("zhansgan",18),Person("lisi",20)))
val dataset = sourceRDD.toDS()
//3.2第二种创建ds方式
val dataset = spark.createDataset(Seq(Person("zhansgan",18),Person("lisi",20)))
//4.通过对象来处理
dataset.filter(item=>item.age>10).show()
//5.通过字段来处理
dataset.filter('age>10)
//6.通过SQL表达式来处理
dataset.filter("age>10").show()
//7.dataset转换为RDD两种方式
//7.1直接获取到已经分析和解析过的DataSet的执行计划,从中拿到RDD
val RDD = dataset.queryExecution.toRdd
//7.2通过将DataSet底层的rdd[InternalRow]转换为和DataSet相同泛型的RDD
val RDD = dataset.rdd
}
}
case class Person(name:String,age:Int)
(2)DataFrame特点
他的设计是借鉴了pandas的dataframe数据类型而产生的.
他的作用是让spark处理大规模的结构化数据能更加容易.
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.junit.Test
class sparkSQLDemo {
@Test
def dataSet2(): Unit = {
//1.创建sparkSession
val spark = SparkSession.builder()
.master("local[6]")
.appName("dataset1")
.getOrCreate()
//2.导入隐式转换
import spark.implicits._
//3.创建df
val df: DataFrame = Seq(Person("zhansgan", 18), Person("lisi", 20)).toDF()
//4.df的操作
//select name from where t.gae > 10
df.where('age>10)
.select('name)
.show()
}
}
case class Person(name:String,age:Int)
2.1DataFram如何创建
toDF
createDataFrame
DataFrameReader
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.junit.Test
class sparkSQLDemo {
@Test
def dataSet2(): Unit = {
//1.创建sparkSession
val spark = SparkSession.builder()
.master("local[6]")
.appName("dataset1")
.getOrCreate()
//2.导入隐式转换
import spark.implicits._
val personsList = Seq(Person("zhansgan",16),Person("lisi",20))
//3.三种创建df方式
//3.1toDF
val df1 = personsList.toDF()
//3.2createDataFrame
val df2 = spark.createDataFrame(personsList)
//3.3read
val df3 = spark.read.csv("dataset/beijing.csv")
}
}
case class Person(name:String,age:Int)
2.2示例
(1)数据分析
数据格式内容如下:
我们的需求是:对于这份北京的pm测绘数据,我们要统计每年的每个月东四测量pm的次数
(2)命令式
import org.apache.spark.sql.SparkSession
import org.junit.Test
class sparkSQLDemo {
@Test
def dataSet2(): Unit = {
//1.创建sparkSession
val spark = SparkSession.builder()
.master("local[6]")
.appName("dataset1")
.getOrCreate()
import spark.implicits._
//2.读取数据集
val df = spark.read
.option("header",value = true)
.csv("dataset/BeijingPM20100101_20151231.csv")
//2.1查看df的Schema(结构信息)信息,就是mysql的desc查看表结构的意思
//df.printSchema()
df.show()
//3.处理
df.select('year,'month,'PM_Dongsi)
.where('PM_Dongsi=!="NA")
.groupBy('year,'month)
.count()
.show()
spark.stop()
}
}
(3)sql式实现
import org.apache.spark.sql.SparkSession
import org.junit.Test
class sparkSQLDemo {
@Test
def dataSet2(): Unit = {
//1.创建sparkSession
val spark = SparkSession.builder()
.master("local[6]")
.appName("dataset2")
.getOrCreate()
//2.读取数据集
val df = spark.read
.option("header",value = true)
.csv("dataset/BeijingPM20100101_20151231.csv")
//4使用sql语句进行查询
//4.1将df注册成为临时表
df.createOrReplaceGlobalTempView("pm")
//5.执行查询
val resultDf = spark.sql("select year, month, count(PM_Dongsi) from pm where PM_Dongsi != 'NA' group by year, month")
resultDf.show()
spark.stop()
}
}
(3)DataFrame和DataSet区别
我们查看源码可以发现DataFram就是DataSet[Row]类型
DataFrame和DataSet是操作方式都是一样的,他们唯一的不同就是DataFrame处理数据类型仅能是Row类型,而DataSet可以是任何类型
(4)什么是Row类型
Row类型对象就是Schema(列名字段)加上一行数据