• 死磕sparkSQL源码之TreeNode


    InternalRow体系

    学习TreeNode之前,我们先了解下InternalRow。

    对于我们一般接触到的数据库关系表来说,我们对于数据库中的数据操作都是按照“行”为单位的。在spark sql内部实现中,InternalRow是用来表示这一行行数据的类。看下源码中的解释,InternalRow作为一个抽象类,包numFields 和 update 方法,以及各列数据对应的 get 与 set 方法,但具体的实现逻辑体现在不同的子类中

    1. /**
    2. * An abstract class for row used internally in Spark SQL, which only contains the columns as
    3. * internal types.
    4. 一个抽象类,用于表示spark SQL内部行,只包含内部类型的多个列(其实就是表示一行行数据的类)
    5. */

    详细代码这里就不贴了,整理下一些重要接口的功能含义好了,注意InternalRow中都是根据下标来访问和操作列元素的 。

    InternalRow实现类包括,BaseGenericinternalRow、UnsafeRow 和 JoinedRow 3 个直接子类

    • BaseGenericinternalRow:也是一个抽象类,实现了SpecializedGetters类中定义的所有GET方法,但是最终还是调用genericGet方法实现最终逻辑,genericGet方法在BaseGenericinternalRow内中只是定义了一个接口,最终实现在BaseGenericinternalRow的子类中。
    • JoinedRow:该类主要用于join操作,两个InternalRow放在一起形成新的InternalRow,在sparksql 聚合和join相关操作中,会用的比较多
    • UnsafeRow:不采用 Java 对象存储的方式,避免了 JVM 中垃圾回收( GC )的代价 。 此外,UnsafeRow 对行数据进行了特定的编码,使得存储更加高效 。

    TreeNode体系

    接下来正式开始进行TreeNode的学习

    TreeNode是Spark SQL中所有树结构的基类,定义了一系列通用的集合操作和树遍历的操作接口。我们先看下TreeNode的代码

    1. abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product with TreePatternBits {
    2. }

    首先TreeNode是一个抽象类,一个泛型类;这里TreeNode[BaseType <: TreeNode[BaseType]]这种书写方式,不知道大家会不会很陌生,反正我一开始看的时候,觉得不知道咋回事,那么我们来一起理解写,这个具体是什么含义:

    • 首先,我们很明确这个TreeNode是个泛型,我们把[]中的看作一个T,其实就是TreeNode[T],这个没问题
    • 接下里,我们要理解下“<:”这个符号的含义,这属于scala泛型中的知识,上边界和下边界。上边界是“<:”,下边界是“>:”;上边界,拿代码中的定义的含义解释就是BaseType必须是TreeNode[BaseType]的子类。也就是说TreeNode的泛型类型用BaseType表示,泛型类型比如是TreeNode类的子类

    另外,TreeNode还继承了Product接口,对于prod

  • 相关阅读:
    软考中级(系统集成项目管理工程师)高频考点:项目进度管理
    Element Plus 文件上传限制格式 大全
    无需API开发,伯俊科技实现电商与客服系统的无缝集成
    ElasticSearch安装、配置详细步骤
    已经是项目经理了,还有必要考PMP吗?
    apache 基线安全加固操作
    【基于Matlab GUI的语音降噪系统设计】
    氨基苯酚/多巴胺仿生修饰碳纳米管/α-氧化铝/ CNTs-Ag纳米复合材料
    C语言指针,深度长文全面讲解
    1076 Forwards on Weibo
  • 原文地址:https://blog.csdn.net/riluomati/article/details/127950109