版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Suubyy/article/details/82563964
-
Spark SQL
定义Spark SQL
是Spark
的一个模块,它是用来处理结构化数据的。- 它将任务利用
SQL
的形式转换成RDD
的计算。类似于Hive
利用SQL
转化成了MapReduce
计算。
-
Spark SQL
优点- 它与
Spark Core
无缝集成,在项目中我们可以与Spark Core
配合实现业务逻辑。 - 它提供了同一的数据源接口
- 它内嵌了
Hive
,可以连接外部已经部署好的Hive
数据源,实现了Hive
的集成 - 标准化的数据连接方式,可以开启
thrift server
为外部提供jdbc
、odbc
的连接访问。
- 它与
-
Spark SQl
的数据抽象DataFrame(1.3)
:Spark
对RDD
的一种抽象,也是一种分布式、不可变的数据集,也只是在RDD
之上加入了Schema
信息,为RDD
中的每个元素的每一列加上了名称与数据类型,这样Spark SQL
就知道了数据的内部结构,比如知道了每列的名称和类型是什么,所以我们可以把DataFrame
看做是一张数据库表,这样Spark
为DataFrame
提供了更加丰富的API
,并且提供了类似于SQL
的语法的操作。性能要比RDD
性能高,因为Spark
为DataFrame
提供了优化器。它的缺点就是编译器是不会进行类型安全检查,只有在运行时进行类型安全检查。DataFrame
是懒执行的,它的数据是以二进制的方式存储在非堆内存中,这样大大减少了内存的开销。Spark
为DataFrame
还提供了执行优化器(catalyst
),当我们在利用SparkSQL
操作数据的时候,Spark
会为我们的查询语法进行自动的优化,提高执行效率。
DataSet(1.6)
:DataSet
是Spark
最新的数据抽象,它扩展了DataFrame
,弥补了DataFrame
的类型安全检查的缺陷,继承了DataFrame
的执行优化。DataFrame
在编译期间是不知道字段的类型的,只有在运行的时候才知道字段的类型,而DataSet
是在编译期间就知道了字段的类型。DataSet
支持编解码器。DataFrame=DataSet[Row],可以利用as方法将DataFrame转换成DataSet,DataSet是一直强类型数据集,在编译器就会校验数据类型。
-
Spark SQL查询方式
- 利用
API
- 注册临时表,利用
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() } }
- 利用