赞
踩
Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用
【2.1】易整合
Spark SQL可以使用SQL或熟悉的DataFrame API在Spark程序中查询结构化数据,可在Java,Scala,Python和R中使用
【2.2】统一的数据访问方式
DataFrame和SQL提供了一种访问各种数据源的通用方法,包括Hive,Avro,Parquet,ORC,JSON和JDBC。甚至可以跨这些源联接数据
【2.3】兼容Hive
Spark SQL支持HiveQL语法以及Hive SerDes和UDF,从而访问现有的Hive仓库
【2.4】标准的数据连接
服务器模式为商业智能工具提供了行业标准的JDBC和ODBC连接
【3.1】SparkSQL可以看做是一个转换层,向下对接各种不同的结构化数据源,向上提供不同的数据访问方式
【3.2】
在SparkSQL中Spark为我们提供了两个新的抽象,分别是DataFrame和DataSet;他们和RDD有什么区别呢?首先从版本的产生上来看:RDD (Spark1.0) —> Dataframe(Spark1.3) —> Dataset(Spark1.6)
如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果。不同是的他们的执行效率和执行方式
注意:在后期的Spark版本中,DataSet会逐步取代RDD和DataFrame成为唯一的API接口
【3.3】RDD
【3.4】DataFrame
执行效率
、减少数据读取
以及执行计划的优化
,比如filter下推、裁剪等…懒执行
的,性能上比RDD要高,主要有两方面原因:定制化内存管理
数据以二进制的方式存在于非堆内存,节省了大量空间之外,还摆脱了GC的限制
劣势
在于在编译期缺少类型安全检查
,导致运行时出错【3.5】DataSet
类型安全检查
也具有DataFrame的查询优化特性
编解码器
,当需要访问非堆
上的数据时可以避免反序列化整个对象
,提高了效率as
方法将DataFrame转换为DataSet,也可以通过 toDF
方法将DataSet转换为DataFrameDataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错,而DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。就跟JSON对象和类对象之间的类比,如下图:
【3.6】RDD、DataFrame和DataSet三者的共性
val sparkconf = new SparkConf().setMaster("local[*]").setAppName("sparkSqlDemo")
val spark = SparkSession.builder().config(sparkconf).getOrCreate()
val rdd = spark.sparkContext.parallelize(Seq(("a", 1), ("b", 1), ("a", 1)))
// 下面这个map并不会运行
rdd.map{line=>
println("运行到这里啦...")
line._1
}
注意:spark不是包名,是SparkSession的名字
import spark.implicits._
DataFrame:
df.map {
case Row(id: Int, name: String, age: Int) => {
println(s"${id},${name},${age}")
name
}
case _ => ""
}
DataSet:
ds.map {
case User(id: Int, name: String, age: Int) => {
println(s"${id},${name},${age}")
name
}
case _ => ""
}
【3.7】RDD、DataFrame和DataSet三者的区别
RDD可以设置类型参数,但RDD并不了解其内部结构
1.与RDD和DataSet不同,DataFrame每一行的类型固定为Row,只有通过解析才能获取各个字段的值,如下: 本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/767049
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。