SparkSQL简介

SparkSQL是用来处理结构化的数据的
		有表头的二维表就是结构化的数据:表头描述了字段名称和字段类型,数据是可以有一到多列(schema)

执行过程

1.使用转换器对SQL或DSL风格的代码进行校验和解析(Parser转换器)
		2.生成未优化的逻辑计划(Analyzer,解析器)
		3.将逻辑计划进行优化,(Optimizer优化器)
		4.将优化过的逻辑计划生成物理计划(Pyhicla Plans物理计划)

Dataset

更加智能的RDD,有Encoder并且在Encoder有Schema和序列化和反序列化方式,还带有执行计划,并且还会对执行计划进行优化
		有执行计划,先根据你对Dataset的操作生成逻辑计划,然后在生成优化过的逻辑计划,最后生成进一步优化的物理计划
		强数据类型,将数据可以放在堆外内存,数据是二进制的(有Encoder),效率更高,更加节省空间,内存管理起来更加灵活高效

DataFrame

RDD + Schema = 可以先生成逻辑计划(DAG),在优化后生成物理计划(Task)
		是Dataset[Row]的一种特殊格式
			有多Row的Encoder, Encoder就是对数据进行序列化和反序列化的规则.Encoer中关联了schema
		DataFrame相当于RDD+Schema,有了更多的描述信息
		有rowEncoder,并且还有schema
		强数据类型,将数据可以放在堆外内存,效率更高,更加节省空间,内存管理起来更加灵活高效

SparkSQL过滤下推

顺序:分区过滤-> 映射下推-> 谓词下推
		分区过滤
			根据分区表,扫描对应分区的数据,不符合条件的数据压根不读
		映射下推
			对列式存储的数据,值只扫描要查询的列的数据
		谓词下推
			根据查询条件进行过滤,可以度文件也可以不读文件,parquet文件的schema信息中有对应列的最大值最小值,如果你要查询的数据小于最小值或大于最大值,压根不读这个文件的数据

各种join的使用场景

Broadcast Hash Join
			适合一张很小的表和一张大表进行Join
				被广播的表需要小于spark.sql.autoBroadcastJoinThreshold所配置的信息,默认是10M
				基表不能被广播,比如left outer join时,只能广播右表
				将广播后的数据根据key在内存中构建hash的映射关系,目的是为了查询快速
		Shuffle Hash Join
			适合一张小表(比上一个大,不能广播)和一张大表进行Join
				可以将两个表的数据使用相同的分区器(hashPartition),将小表也构造成hash的结果,可以放内存,如果内存放不下会dump到磁盘中
		Sort Merge Join
			适合两张大表进行Join
				先使用hashPartitioner分区,先在每个分区先局部排序,shuffler read后在进行归并排序,将数据翻入到磁盘,先遍历左表的数据,然后根据条件关联有表的数据,目的就是为了关联的时候查找更快