SparkSQL概述、6种不同数据格式创建DataFream方式、3种函数
一、SparkSQL简述
1 SparkSQL产生
Hive->Shark->SparkSQL
Shark Hive on Spark Hive即作为存储又负责sql的解析优化,Spark负责执行
SparkSQL Spark on Hive Hive只作为储存角色,Spark负责sql解析优化,执行
SparkSQL产生的根本原因是为了完全脱离Hive限制(解耦)
2 SparkSQL特点
SparkSQL兼容所有的Hive和Shark语法
SparkSQL支持查询原生的RDD。 RDD是Spark平台的核心概念,是Spark能够高效的处理大数据的各种场景的基础
能够在Scala中写SQL语句。支持简单的SQL语法检查,能够在Scala中写Hive语句访问Hive数据,并将结果取回作为RDD使用--------> df.rdd + val age: Long = row.getAs[Long] (“age”)
使用DataFrame分布式容器
3-1 DataFrame分布式数据容器
DataSet = DataFream
DataFrame也是一个分布式数据容器,与RDD类似
DataFrame更像一张二维表格,有数据也有列的Schema信息–数据的结构信息
DataFrame与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)
DataFrame的底层封装的是RDD,只不过RDD的泛型是Row类型
想要使用SQL查询分布式数据,必须创建DataFream,而后可以注册视图,使用SQL查询
DataFrame转化成RDD df.rdd
3-2 DateSet-区别RDD与创建
1 SparkCore底层操作的是RDD,SparkSQL底层操作的是DataSet
2 序列化机制与RDD不同,可以不用反序列化成对象再去调用该对象中的方法
3 在RDD的基础上增加了一些方法
4 强类型,类似于DataFream,默认列名是“value”
5 三种创建方法
a 由集合 创建DataSet
1 Person对象
//直接映射成Person类型的DataSet
val list = List[Person](
Person(1,"zhangsan",18,100),
Person(2,"lisi",19,200),
Person(3,"wangwu",20,300)
)
val personDs: Dataset[Person] = list.toDS()
personDs.show(100)
2 集合
val value: Dataset[Int] = List[Int](1, 2, 3, 4, 5).toDS()
value.show()
b 由json文件和类 直接映射成DataSet
val lines: Dataset[Student] = spark.read.json("./Test_spark/data/json").as[Student]
c 读取外部文件 直接加载DataSet
val dataSet: Dataset[String] = spark.read.textFile("./Test_spark/data//people.txt")
val result: Dataset[Person] = dataSet.map(line => {
val arr: Array[String] = line.split(",")
Person(arr(0).toInt, arr(1).toString, arr(2).toInt, arr(3).toDouble)
})
result.show()
4 SparkSQL数据源
JSON类型的字符串,JDBC,Parquent,Hive,HDFS等
5 SparkSQL底层架构
首先拿到sql后解析一批未被解决的逻辑计划,再经过分析得到分析后的逻辑计划,再经过一批优化规则转换成一批最佳优化的逻辑计划,再经过SparkPlanner的策略转化成一批物理计划,随后经过消费模型转换成一个个的Spark任务执行
6 谓词下推-优化job
以下列语句为例:
SELECT table1.name,table2.score FROM table1
Join table2 ON(table1.id=table2.id)
WHERE table1.age>50 AND table2.score>90