0-SparkSql_base

Spark SQL是用于处理结构化数据的组件,它允许通过SQL语句或API进行高性能的关系数据操作。核心模块包括SparkSession,用于创建DataFrame和Dataset,以及内部Row和表达式。Analyzer和Optimizer对逻辑计划进行解析和优化,而Physical Plan则负责执行。编码器(Encoder)用于对象和内部数据结构之间的转换。此外,Spark SQL支持多种数据源,如文件系统和数据库,并能与其他高级算法如图计算和机器学习集成。
摘要由CSDN通过智能技术生成

SparkSql

  • 结构化数据处理 ==> RDD + schema
  • 可以通过sql语句执行处理
  • 支持spark Rdd 和外部数据的关系处理
  • 高性能的关系数据操作
  • 易于扩展数据源,如半结构化数据,外部数据
  • 可以被其他高级算法使用如graph,machine learning

##基本流程

基本组件

sql 项目的core 模块

  • 定义如何将数据转换成Dataset & DataFrame,sql api 的入口对象
  • 逻辑计划转成物理计划,计划执行
SparkSession
  • spark sql api[ Dataset & DataFrame]入口函数
    • 创建 DataFrame 来自于:
      • rdd: RDD[A]
      • data: Seq[A]
      • rowRDD: RDD[Row] , schema: StructType
      • rows: java.util.List[Row], schema: StructType
      • rdd: RDD[], beanClass: Class[]
      • data: java.util.List[], beanClass: Class[]
    • 创建 Dataset 来自于:
      • data: Seq[T]
      • data: java.util.List[T]
  • 直接加载外部数据成为Dataframe的read:DataFrameReader
    • 文件系统
    • 数据库等
Datasets
  1. 强类型的分布式数据集合
  2. 可以并行函数转换处理
  3. DataSet的操作分为transformations 和 actions , Transformations 产生新的 DataSet , actions 执行计算返回结果、Dataset用一个逻辑计划描述数据如何处理计算,action调用时,优化逻辑计划,生成物理计划并行高效执行
  4. 通过Encoder
    • 运行时生成的自定义bytecode序列化反序列化,加速,减少网络传输
    • 一些操作无需反序列化就可以操作
Encoder
  • 将jvm类型为T的jvm对象转换为spark sql 内部的结构表现
  • 通常由sparksession隐式转换而来
import spark.implicits._
val ds = Seq(1, 2, 3).toDS() // implicitly provided (spark.implicits.newIntEncoder)
  • fields
    • schema : StructType <==
    • clsTag: ClassTag[T] <== 保存类型信息,构造array的时候生成该类型的元素

org.apache.spark.sql.sources

BaseRelation
  • 代表一组已知schema的元组tuples,spark sql处理数据的统一方式
  • 统一的数据处理对象,包含了数据结构,以及如何读取数据

sql 项目的catalyst 模块

  • SparkSQL的优化器系统模块
  • 主要功能:
    • Parser,解析,将sql语句解析成LogicalPlan(语法树)
      • 对于sql中的属性和关系并没有检查和解析,UnresolvedAttribute,UnresolvedRelation
    • Analyzer,分析,遍历plan的所有节点应用配置的一系列规则,一系列规则rule,检查查询语句中使用的对象是否准确
    • Optimizer,优化,基于规则的优化策略实际上就是对语法树进行一次遍历,模式匹配能够满足特定规则的节点,再进行相应的等价转换
org.apache.spark.sql.catalyst.InternalRow
  • 在spark sql中内部使用的抽象类,代表一行
  • 只包含列名,和内部对应的类型
org.apache.spark.sql.catalyst.expressions.UnsafeRow extends InternalRow
  • 原始内存数据,二进制数据8-byte word per field,方便快速序列化和传输
  • Each tuple has three parts: [null bit set] [values] [variable length portion]
  • 由原始内存支持的类型取代java对象,spark内部类型,方便序列化反序列化,内存管理
  • 每个元组有三部分组成
    • [null bit set]用来跟踪字段是否是null,分配了8个字节标记,每隔字段使用一位表示
    • [values]每个字段存储一个8字节,对于基本类型字段(long,double,init),长度固定直接保存名称,对于非固定长度的字段保存offset
      

org.apache.spark.sql.catalyst.trees

TreeNode[BaseType <: TreeNode[BaseType]] extends Product
  • TreeNode是spark sql 的基础,理解之后会更容易理解spark sql 处理流
  • 无论是sql语句还是api接口方法都会转换成一个语法树,有了语法树就可以优化,执行等操作。
  • 语法树的构建都是由一个个TreeNode组成
  • TreeNode指的是用于构建一般的树的结点
  • 通过children: Seq[BaseType]描述了一个一对多的父子关系,child节点同样可以有多个子节点
  • 主要方法
    • find -- 找到满足条件的第一个节点
    • foreach(先在父亲节点执行,在调用子类执行),foreachUp(先最底层子类执行,再父类执行)遍历所有节点执行给定的函数
    • map-- 执行foreach函数并收集说有结果返回
    • collect -- 收集所有节点
    • withNewChildren -- 替换有变化的孩子节点并生成一个新的树
      • 全局代码生成的时候替换,plan.withNewChildren(plan.children.map(insertWholeStageCodegen))
    • mapProductIterator
      • 遍历所有元素(cass class 的所有字段)应用指定的函数f
    • transform
      • 接收一个PartialFunction函数,将Rule迭代应用到该节点的所有子节点,最后返回这个节点的副本
    • makeCopy
      • 反射生成新的节点
  • 两个子类
    • QueryPlan
    • Expression

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值