SparkSQL之Rule体系

在Unresolved LogicalPlan逻辑算子树的操作(如绑定、解析、优化等)中,主要方法都是基于规则(Rule)的,通过Scala语言模式匹配机制(Pattern-match)进行树结构的转换或节点改写。Rule是一个抽象类,子类需要复写apply(plan:TreeType)方法来制定特定的处理逻辑,基本定义如下。

abstract class Rule[TreeType <: TreeNode[_]] extends Logging {
  /** Name for this rule, automatically inferred based on class name. */
  val ruleName: String = {
  	val className = getClass.getName
  	if (className endsWith "$") className.dropRight(1) else className
  }
  def apply(plan: TreeType): TreeType
}

有了各种具体规则后,还需要驱动程序来调用这些规则,在Catalyst中这个功能由RuleExecutor提供。凡是涉及树型结构的转换过程(如Analyzer逻辑算子树分析过程、Optimizer逻辑算子树的优化过程和后续物理算子树的生成过程等),都要实施规则匹配和节点处理,都继承自RuleExecutor[TreeType]抽象类,如下图所示。
请添加图片描述
RuleExecutor内部提供了一个Seq[Batch],里面定义的是该RuleExecutor的处理步骤。每个Batch代表一套规则,配备一个策略,该策略说明了迭代次数(一次还是多次)。RuleExecutor的apply(plan:TreeType):TreeType方法会按照batches顺序和batch内的Rules顺序,对传入的plan里的节点进行迭代处理,处理逻辑由具体Rule子类实现。

def execute(plan: TreeType): TreeType = {
    var curPlan = plan
    batches.foreach { batch =>
      val batchStartPlan = curPlan
      var iteration = 1
      var lastPlan = curPlan
      var continue = true
      while (continue) {
        curPlan = batch.rules.foldLeft(curPlan) {
          case (plan, rule) => rule(plan)
        }
        iteration += 1
        if (iteration > batch.strategy.maxIterations) {
          continue = false
        }
        if (curPlan.fastEquals(lastPlan)) {
          continue = false
        }
        lastPlan = curPlan
      }
    }
    curPlan
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/134947.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

践行“微”使命——建行江门市分行大力发展普惠金融支持小微企业

促进小微企业发展是保持国民经济高质量发展的重要基础。建行广东省江门市分行立足当地特色产业之需&#xff0c;以金融活水润泽侨乡众多小微企业&#xff0c;携手共赴美好未来。 双向奔赴&#xff0c;添翼高企发展 江门开平水口镇是全国三大水暖卫浴生产基地之一&#xff0c;…

PDF文件编辑器有哪些?10 个适用的PDF 编辑器推荐!

PDF 编辑器始终配备简单的界面以及高效管理工作所需的所有功能。 那么如何选择合适的版本呢&#xff1f;在线工具还是离线工具更好&#xff1f; 为了帮助您回答这些问题&#xff0c;我将通过多次深入的测试来详细回顾十大免费编辑器。现在让我们来探索一下吧&#xff01; 10 …

UDP协议

1.UDP协议的特点 无连接&#xff1a;不需要双方建立连接&#xff0c;直接就可以发送&#xff0c;就类似发短信&#xff0c;不需要知道对方是否在线&#xff0c;直接发送不可靠传输&#xff1a;无法知道对方是否有收到信息面向数据报&#xff1a;发送消息是以数据报尾单位全双工…

游戏交易平台系统源码下载 网络游戏币、装备、账号、道具等交易网站源码

最新仿7881游戏交易平台系统源码下载网络游戏币、装备、账号、道具等交易网站源码 下载地址&#xff1a;https://bbs.csdn.net/topics/617562568

数据结构与算法之排序: Leetcode 21. 合并两个有序链表 (Typescript版)

合并两个有序链表 https://leetcode.cn/problems/merge-two-sorted-lists/ 描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 …

最详细ChatGPT+AI绘画+企业知识库+视频去水印系统源码搭建流程,手把手教你搭建

一、系统介绍 这款源码搭载了强大的AI问答功能&#xff0c;是基于目前最强大AI大语言模型ChatGPT进行开发的Ai智能问答系统&#xff0c;并使用stablediffusion加最新的comfyui作为底层技术的绘画系统,使用comfyui的api接口&#xff0c;可以更灵活的定制自己的绘画工作流&#…

亲身体验告诉你:亚马逊云科技海外服务器是否值得一试?

前言 在当今数字化时代&#xff0c;云计算已经成为企业和个人发展的重要支撑。亚马逊云科技作为全球领先的云计算服务提供商&#xff0c;其海外服务器备受瞩目。然而&#xff0c;对于一些用户来说&#xff0c;是否值得一试亚马逊云科技的海外服务器仍然是一个疑问。本文将通过亲…

02. Python基础数据类型

1、前言 前面我们介绍了认识了Python以及Python的基础环境搭建&#xff0c;今天我们介绍下Python的一些基础语法。 2、Python基础 2.1、输入输出 2.1.1、输出 print() 用于输出指定的文字&#xff0c;括号中的为输出的字符串。print()也可以同时接收多个字符串&#xff0c;…

CHM Viewer Star 6.3.2(CHM文件阅读)

CHM Viewer Star 是一款适用于 Mac 平台的 CHM 文件阅读器软件&#xff0c;支持本地和远程 CHM 文件的打开和查看。它提供了直观易用的界面设计&#xff0c;支持多种浏览模式&#xff0c;如书籍模式、缩略图模式和文本模式等&#xff0c;并提供了丰富的功能和工具&#xff0c;如…

Linux各种版本安装详细步骤和root密码破解

文章目录 VMware新建虚拟机硬件设置设置虚拟网络挂载ISO文件 root密码破解 VMware新建虚拟机 硬件设置 设置虚拟网络 编辑>虚拟网络编辑器>VMnet8(NAT模式) 挂载ISO文件 加电>开启次虚拟机 第二项可以检查挂载上来的iso文件是否完整没有破坏 磁盘分区 选自定义分…

服务号如何升级订阅号

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要知道服务号和订阅号有什么区别。服务号侧重于对用户进行服务&#xff0c;每月可推送4次&#xff0c;每次最多8篇文章&#xff0c;发送的消息直接显示在好友列表中。订阅号更侧重于信息传…

夯实思想根基:建行江门市分行持续加强党建工作

建行广东省江门市分行深化落实新时代党的建设总要求&#xff0c;坚持不懈用先进思想武装头脑和凝心铸魂&#xff0c;强化党建工作&#xff0c;夯实思想根基&#xff0c;护航高质量发展。 我是党员我先学 理论学习是党员的“永恒课题”。建行江门分行全体党员干部依托数字党建…

Web APIs——正则表达式使用

1、什么是正则表达式 正则表达式&#xff08;Regular Expression&#xff09;是用于匹配字符串中字符组合的模式。在JavaScript中&#xff0c;正则表达式也是对象 通常用来查找、替换那些符合正则表达式的文本&#xff0c;许多语言都支持正则表达式 1.1 正则表达式使用场景 例如…

desc相关注入

desc相关注入 补充

Java算法(七):随机产生验证码 前后端验证码比对处理 实战思路步骤

Java算法&#xff08;七&#xff09; 随机产生验证码 package com.liujintao.random;import java.util.Random; import java.util.Scanner;public class RandomNumber {/*** 该函数调用验证码所有的函数&#xff0c;完成验证码模块功能开发* param args*/public static void …

某城高速综合管控大数据大屏可视化【可视化项目案例-04】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…

Python之函数进阶-nonlocal和LEGB

Python之函数进阶-nonlocal和LEGB nonlocal语句 nonlocal:将变量标记为不在本地作用域定义&#xff0c;而是在上级的某一级局部作用域中定义&#xff0c;但不能是全局作用域中定义。 函数的销毁 定义一个函数就是生成一个函数对象&#xff0c;函数名指向的就是函数对象。可…

【中间件篇-Redis缓存数据库05】Redis集群高可用高并发

Redis集群 Redis Cluster是Redis的分布式解决方案&#xff0c;在3.0版本正式推出&#xff0c;有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时&#xff0c;可以采用Cluster架构方案达到负载均衡的目的。之前,Redis分布式方案一般有两种: 1、客户端分…

vue 使用js new Map()优化多个if else 执行方法

前言 在实际开发中根据业务需求我们经常要判断情况&#xff0c;一个if 我们科技直接使用ES6就可以解决 经常会出现根据不同的条件执行不同的方法&#xff0c;这是就会有多个if else 看起不太美观也费劲 js new map &#xff08;&#xff09;就可以解决这个问题&#xff0c;它…

Tkinter,一个轻量级的Python GUI库

欢迎关注作者微信公众号&#xff1a;愤怒的it男 Tkinter&#xff08;即 tk interface&#xff0c;简称“Tk”&#xff09;本质上是对Tcl/Tk软件包的Python接口封装&#xff0c;属于Python自带的标准库&#xff0c;安装好Python后可以直接使用Tkinter库而无须另行安装。Tkinter库…