sparksql简介
Spark SQL是Spark用来处理结构化数据的
RDD + Schema = 可以先生成逻辑计划(DAG), 在优化后生成物理计划(Task)
Dataset: 更加智能的RDD, 有Encoder并且在Encoder有Schema和序列化和反序列化方法, 还带有执行计划
有执行计划, 先根据你对Dataset的操作生成逻辑计划, 然后在生成优化过的逻辑计划, 最后生成进一步优化的物理计划
强数据类型, 将数据放在堆外内存, 效率更高, 更加节省空间, 内存管理起来更加灵活高效
DataFrame: 是Dataset[Row]的一种特殊格式
DataFrame相当于RDD+Schema, 有了更多的描述信息
有rowEncoder, 并且还有schema
强数据类型, 将数据放在堆外内存, 效率更高, 更加节省空间, 内存管理起来更加灵活高效
网站(spark.apache.org/sql)
1. 什么是DataFrames?
与RDD类似, DataFrame也是一个分布式数据容器[抽象的], 然而DataFrame更像传统数据库的二维表格, 除了RDD的描述数据以外, 还记录数据的结构信息, 即 schema,
与hive相似, DataFrame也支持嵌套数据类型(struct, array和map)
DataFrame = RDD + Schema【更加详细的结构化描述信息】,以后在执行就可以生成执行计划,进行优化,是Dataset的一种特殊格式
2. sparksql特性
1) 易整合
Spark SQL使得在spark编程中可以混搭SQL和算子API编程
2) 统一的数据格式
Spark SQL为各类不同数据源提供统一的访问方式,可以跨各类数据源进行愉快的join;所支持的数据源包括但不限于: Hive / Avro / CSV / Parquet / ORC / JSON / JDBC等;
3) 兼容Hive
Spark SQL支持HiveQL语法及Hive的SerDes、UDFs,并允许你访问已经存在的Hive数仓数据;
4) 标准的数据连接
Spark SQL的server模式可为各类BI工具提供行业标准的JDBC/ODBC连接,从而可以为支持标准JDBC/ODBC连接的各类工具提供无缝对接;(开发封装平台很有用哦!)
SparkSQL可以看做一个转换层,向下对接各种不同的结构化数据源,向上提供不同的数据访问方式
创建DataFrame (常用第一种和第三种, 第三种是最正宗的写法)
第一种创建方法: 将RDD关联case class创建DataFrame
package cn.doit.spark.sql01
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
/*
将RDD关联Case class创建DataFrame
+------+-------+------+
| name|subject|scores|
+------+-------+------+
|孙悟空| 数学| 95|
| 娜娜| 语文| 94|
|孙悟空| 语文| 87|
| 宋宋| 数学| 86|
| 婷婷| 数学| 85|
| 娜娜| 英语| 84|
| 宋宋| 英语| 84|
| 婷婷| 英语| 78|
|孙悟空| 英语| 68|
| 婷婷| 语文| 65|
| 宋宋| 语文| 64|
| 娜娜| 数学| 56|
+------+-------+------+
*/
object DataFrameCreateDemo01 {
def main(args: Array[String]): Unit = {
//创建SparkConf, 然后创建SparkContext
//使用SparkContext创建RDD
//调用RDD的算子(Transformation和Action')
//释放资源 sc.stop
//创建SparkSession builder(构建) getOrCreate(创建)
val spark: SparkSession = SparkSession.builder()
.appName("DataFrameCreateDemo01")
.master("local[*]")
.getOrCreate()
val sc = spark.sparkContext
val rdd1: RDD[String] = sc.textFile("hdfs://linux01:8020/tb_stu")
val rdd2: RDD[User] = rdd1.map(e => {
val fields = e.split("\t")
User(fields(0), fields(1), fie