大数据组件-sparkSQL是什么,应用场景,编写流程,DataSet和DataFrame

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(列名字段)加上一行数据
在这里插入图片描述

5.Catalyst优化器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章