Spark SQL(二十)初识Spark SQL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Suubyy/article/details/82563964
  1. Spark SQL定义

    1. Spark SQLSpark的一个模块,它是用来处理结构化数据的。
    2. 它将任务利用SQL的形式转换成RDD的计算。类似于Hive利用SQL转化成了MapReduce计算。
  2. Spark SQL优点

    1. 它与Spark Core无缝集成,在项目中我们可以与Spark Core配合实现业务逻辑。
    2. 它提供了同一的数据源接口
    3. 它内嵌了Hive,可以连接外部已经部署好的Hive数据源,实现了Hive的集成
    4. 标准化的数据连接方式,可以开启thrift server 为外部提供jdbcodbc的连接访问。
  3. Spark SQl的数据抽象

    1. DataFrame(1.3)SparkRDD的一种抽象,也是一种分布式、不可变的数据集,也只是在RDD之上加入了Schema信息,为RDD中的每个元素的每一列加上了名称与数据类型,这样Spark SQL就知道了数据的内部结构,比如知道了每列的名称和类型是什么,所以我们可以把DataFrame看做是一张数据库表,这样SparkDataFrame提供了更加丰富的API,并且提供了类似于SQL的语法的操作。性能要比RDD性能高,因为SparkDataFrame提供了优化器。它的缺点就是编译器是不会进行类型安全检查,只有在运行时进行类型安全检查。DataFrame是懒执行的,它的数据是以二进制的方式存储在非堆内存中,这样大大减少了内存的开销。SparkDataFrame还提供了执行优化器(catalyst),当我们在利用SparkSQL操作数据的时候,Spark会为我们的查询语法进行自动的优化,提高执行效率。
      这里写图片描述
    2. DataSet(1.6)DataSetSpark最新的数据抽象,它扩展了DataFrame,弥补了DataFrame的类型安全检查的缺陷,继承了DataFrame的执行优化。DataFrame在编译期间是不知道字段的类型的,只有在运行的时候才知道字段的类型,而DataSet是在编译期间就知道了字段的类型。DataSet支持编解码器。DataFrame=DataSet[Row],可以利用as方法将DataFrame转换成DataSet,DataSet是一直强类型数据集,在编译器就会校验数据类型。
  4. Spark SQL查询方式

    1. 利用API
    2. 注册临时表,利用SQL查询
    package com.lyz.sql.dataframe
    import org.apache.spark.sql.{DataFrame, SparkSession}
    
    object DataFrameTest {
      def main(args: Array[String]): Unit = {
        val sparkSession: SparkSession = SparkSession.builder().appName("DataFrameTest").master("local[2]").getOrCreate()
        val peopleDF: DataFrame = sparkSession.read.json("C:\\Users\\39402\\Desktop\\people.json")
        //引入隐式转换
        import sparkSession.implicits._
        /**
          * 打印结果为
          * +---+------+
          * |age|  name|
          * +---+------+
          * | 10|zhang3|
          * | 11|   li4|
          * | 12| wang5|
          * | 13| zhao6|
          * +---+------+
          *
          *
          */
        peopleDF.show()
    
        /**
          * 打印结果为
          *
          * | 11|  li4|
          * | 12|wang5|
          * | 13|zhao6|
          * +---+-----+
          *
          *
          */
        //第一种方式利用Spark API的方式来处理数据
        //$"age"这是一种DSL表达式,这个表达式相当一个变量,可以进行逻辑运算,例如:$"age"+10
        peopleDF.filter($"age" > 10).show()
    
        /**
          * 打印结果为
          * +---+------+
          * |age|  name|
          * +---+------+
          * | 10|zhang3|
          * | 11|   li4|
          * | 12| wang5|
          * | 13| zhao6|
          * +---+------+
          */
        //第二种方式利用sql方式处理数据
        //转换成临时表,用sql查询
        peopleDF.createOrReplaceTempView("people")
        sparkSession.sql("select * from people").show()
      }
    }
    
    

猜你喜欢

转载自blog.csdn.net/Suubyy/article/details/82563964