赞
踩
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可以看做一个转换层,向下对接各种不同的结构化数据源,向上提供不同的数据访问方式
第一种创建方法: 将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), fields(2).toInt)
- })
-
- //导入隐式转换
- import spark.implicits._
- //将RDD转成特殊的数据集
- val df: DataFrame = rdd2.toDF()
-
- //使用两种风格的API
-
- //使用SQL风格
- //创建一个临时的视图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。