【Spark源码分析】规则框架- `analysis`分析阶段使用的规则
analysis
分析阶段使用的规则
规则批 | 策略 | 规则 | 说明 |
---|---|---|---|
Substitution | fixedPoint | OptimizeUpdateFields | 该规则优化了 UpdateFields 表达式链,因此看起来更像优化规则。但是,在处理深嵌套模式时,UpdateFields 表达式树可能会非常复杂,导致分析无法进行。因此,我们需要在分析开始时尽早优化 UpdateFields 。 |
CTESubstitution | 分析 WITH 节点,并根据以下条件用 CTE 引用或 CTE 定义替代子计划: 1. 如果在传统模式下,或如果查询是 SQL 命令或 DML 语句,则用 CTE 定义(即内联 CTE)替换。 2. 否则,替换为 CTE 引用 CTERelationRefs。是否内联将在查询分析后由 InlineCTE 规则决定。 替换后未内联的所有 CTE 定义将归入主查询和子查询的一个 WithCTE 节点下。任何不包含 CTE 或已内联所有 CTE 的主查询或子查询显然都不会有任何 WithCTE 节点。如果有,WithCTE 节点将与最外层的 With 节点位于同一位置。 WithCTE 节点中的 CTE 定义将按照它们被解析的顺序排列。这意味着对于任何有效的 CTE 查询,CTE 定义都能保证按照它们的依赖关系以拓扑顺序排列(即,给定 CTE 定义 A 和 B,且 B 引用 A,则 A 保证出现在 B 之前)。否则,这一定是一个无效的用户查询,稍后关系解析规则将抛出分析异常。 | ||
BindParameters | 查找 ParameterizedQuery 中所有已命名的参数,并用用户指定参数中的字面量替换它们。 | ||
WindowsSubstitution | 用 WindowSpecDefinitions 代替子计划。 WindowSpecDefinition 是窗口函数的规范。 | ||
EliminateUnions | 如果只有一个子项,则从计划中删除 Union 算子 | ||
SubstituteUnresolvedOrdinals | 用 UnresolvedOrdinal 表达式替换 “order by ”或 “group by ”中的序号。 | ||
Disable Hints | Once | DisableHints | 当设置了 spark.sql.optimizer.disableHints 时,删除所有提示。这将在分析器开始时执行,以禁用提示功能。 |
Hints | fixedPoint | ResolveJoinStrategyHints | 允许的连接策略提示列表在 JoinStrategyHint.strategies 中定义,连接策略提示可以指定关系别名序列,例如 “MERGE(a, c)”、“BROADCAST(a)”。连接策略提示计划节点将被插入任何与指定名称相匹配的关系(没有不同的别名)、子查询或公共表表达式的顶部。 提示解析的工作方式是向下递归遍历查询计划,找到与指定关系别名之一匹配的关系或子查询。遍历不会超出任何视图引用、子查询别名。 该规则必须在普通表表达式之前执行。 |
ResolveCoalesceHints | COALESCE Hint 提示接受名称 “COALESCE”、“REPARTITION ”和 “REPARTITION_BY_RANGE”。 | ||
Simple Sanity Check | Once | LookupFunctions | 检查 UnresolvedFunction 引用的函数标识符是否在函数注册表中定义。请注意,该规则不会尝试解析 UnresolvedFunction。它只是根据函数标识符执行简单的存在性检查,以快速识别未定义的函数,而不会触发关系解析,这在某些情况下可能会导致昂贵的分区/模式发现过程。为了避免重复查找外部函数,外部函数标识符将存储在本地哈希集 externalFunctionNameSet 中。 |
Keep Legacy Outputs | Once | KeepLegacyOutputs | spark.sql.legacy.keepCommandOutputSchema 为true时,保留 SQL 命令传统输出的规则。ShowTables,ShowNamespaces,DescribeNamespace,ShowTableProperties。 |
Resolution | fixedPoint | ResolveCatalogs | 解析table/view/function/namespace的名称部分目录。 |
ResolveUserSpecifiedColumns | 解析用户指定的列。当用户在 INSERT INTO 中指定列列表时,为 DSv1 提供了重新排列列顺序的特殊规则。DSv2 由 Analyzer.ResolveInsertInto 单独处理。ResolveInsertInto 单独处理。 | ||
ResolveInsertInto | 解析INSERT INTO 语句 | ||
ResolveRelations | 用catalog中的具体关系替换未解决的关系(表和视图)。 | ||
ResolvePartitionSpec | 在分区相关命令中将UnresolvedPartitionSpec 解析成ResolvedPartitionSpec 。 | ||
ResolveFieldNameAndPosition | 根据命令的大小写敏感性解析、规范化和重写字段名称的规则。 | ||
AddMetadataColumns | 当节点缺少已解析的属性时,为子关系的输出添加元数据列。 元数据列的引用是使用 LogicalPlan.metadataOutput 中的列来解析的,但在关系被替换之前,关系的输出不包括元数据列。除非此规则将元数据添加到关系的输出中,否则分析器会检测到没有产生这些列。 只有当节点已解析但缺少其子节点的输入时,该规则才会添加元数据列。这样可以确保除非使用了元数据列,否则不会将其添加到计划中。通过只检查已解析的节点,可确保 * 扩展已完成,这样元数据列就不会被 * 意外选中。此规则会向下解析操作符,以避免过早投影出元数据列。 | ||
DeduplicateRelations | LogicalPlan的关系去重 | ||
ResolveReferences | 解析查询计划中的列引用。基本上,它会自下而上地转换查询计划树,只有当一个计划节点的所有子节点都已解析,且子节点之间不存在冲突属性时,才会尝试解析该节点的引用(详见 hasConflictingAttrs)。 | ||
ResolveLateralColumnAliasReference | 该规则是解决横向列别名的第二阶段。 解析横向列别名,它引用了之前在 SELECT 列表中定义的别名。从计划角度看,它处理两种类型的操作符: 项目和聚合。- 在 “项目 ”中,将引用的横向别名下推到新创建的 “项目 ”中,解析引用这些别名的属性 - 在 “聚合 ”中,在上面插入 “项目 ”节点,并返回到 “项目 ”的解析。 | ||
ResolveExpressionsWithNamePlaceholders | 如果表达式中包含 NamePlaceholders,则解析表达式。NamePlaceholders代表的是占位符的 | ||
ResolveDeserializer | 用已解析为给定输入属性的反序列化表达式替换 UnresolvedDeserializer。 | ||
ResolveNewInstance | 如果正在构造的对象是一个内部类,则通过查找并添加外部作用域来解决 NewInstance 问题。 | ||
ResolveUpCast | 用 Cast 替换 UpCast 表达式,并在可能截断的情况下抛出异常。 | ||
ResolveGroupingAnalytics | 解析grouping函数 | ||
ResolvePivot | 解析Pivot, | ||
ResolveUnpivot | 解析Unpivot, | ||
ResolveOrdinalInOrderByAndGroupBy | 在SQL的许多方言中,在order/sort by和group by子句中使用的顺序位置是有效的。此规则用于将序号位置转换为选择列表中的相应表达式。Spark 2.0中引入了这种支持。如果排序引用或分组依据表达式不是整数而是可折叠表达式,请忽略它们。当spark.sql.orderByOrdinal/spark.sql.groupByOrdinal设置为false,也忽略位置号。 | ||
ExtractGenerator | 从Project操作符的Project列表中提取Generator,并在Project下创建Generator操作符。 在以下情况下,该规则会抛出 AnalysisException: 1. 生成器嵌套在表达式中,例如:SELECT explode(list) + 1 FROM tbl 2. 在项目列表中发现多个生成器,例如:SELECT explode(list), explode(list) FROM tbl 3. 在非 Project 或 Generate 的其他操作符中发现 Generator,例如 SELECT * FROM tbl SORT BY explode(list) | ||
ResolveGenerate | 重写表。生成表达式,这些表达式需要以下一项或多项才能解析:输出的具体属性引用。 从SELECT子句(即从Project)重新定位到Generate子句中。 输出Attribute 的名称是从封装Generator 的Alias 或MultiAlias 表达式中提取的。 | ||
ResolveFunctions | 用具体的 LogicalPlans 代替 UnresolvedFunctionNames。 用具体的表达式替换 UnresolvedFunctions。 用具体表达式替换 UnresolvedGenerators。 用具体的 LogicalPlans 代替 UnresolvedTableValuedFunctions。 | ||
ResolveAliases | 用具体的别名代替 UnresolvedAliass。 | ||
ResolveSubquery | 该规则可解析和重写表达式内部的子查询。 注:CTE 在 CTESubstitution 中处理。 | ||
ResolveSubqueryColumnAliases | 用投影替换子查询中未解决的列别名。 | ||
ResolveWindowOrder | 检查和添加顺序到AggregateWindowFunction | ||
ResolveWindowFrame | 检查并为所有窗口功能添加合适的窗口框架。 | ||
ResolveNaturalAndUsingJoin | 根据两侧的输出计算输出列,消除自然连接或使用连接,然后在普通连接上应用 Project 消除自然连接或使用连接。 | ||
ResolveOutputRelation | 根据逻辑计划中的数据解析输出表的列。该规则将 - 按名称写入时重新排列列顺序 - 在数据类型不匹配时插入转换 - 在列名不匹配时插入别名 - 检测与输出表不兼容的计划并抛出 AnalysisException | ||
ExtractWindowExpressions | 从 Project 运算符的 projectList 和 Aggregate 运算符的 aggregateExpressions 中提取 WindowExpressions,并为每个不同的 WindowSpecDefinition 创建单独的 Window 运算符。 | ||
GlobalAggregates | 将包含聚合表达式的投影转化为聚合。 | ||
ResolveAggregateFunctions | 该规则可查找不在聚合运算符中的聚合表达式。例如,HAVING 子句或 ORDER BY 子句中的表达式。这些表达式会被下推到底层的聚合运算符,然后在原始运算符后被投影掉。 在从中查找聚合函数和分组表达式之前,我们需要确保所有表达式都已完全解析。 | ||
TimeWindowing | 使用扩展运算符将时间列映射到多个时间窗口。要知道一个时间列可以映射到多少个窗口并非易事,因此我们会高估窗口的数量,并过滤掉时间列不在时间窗口内的行。 | ||
SessionWindowing | 将时间列映射到会话窗口。 | ||
ResolveWindowTime | 解析 window_time 表达式,从作为窗口聚合运算符输出的窗口列中提取正确的窗口时间。窗口列的类型为 struct { start: TimestampType, end: TimestampType }。窗口的正确代表事件时间是 window. | ||
ResolveDefaultColumns | 这是一条在 CREATE/ REPLACE TABLE 等语句中处理 DEFAULT 列的规则。 CREATE TABLE 和 ALTER TABLE 调用支持为以后的操作设置列默认值。随后的 INSERT、UPDATE 和 MERGE 命令可根据需要使用 DEFAULT 关键字引用该值。 | ||
ResolveInlineTables | 使用LocalRelation 替换UnresolvedInlineTable | ||
ResolveLambdaVariables | 解决高阶函数公开的 lambda 变量。 该规则分两步运行: [1]. 将高阶函数公开的匿名变量绑定到 lambda 函数的参数上;这样就创建了命名和类型化的 lambda 变量。在这一步中,将检查参数名称是否重复,并检查参数的数量。 [2]. 解析 lambda 函数的函数表达式树中使用的 lambda 变量。请注意,我们允许使用当前 lambda 之外的变量,这些变量可以是定义在外层作用域中的 lambda 函数,也可以是由计划的子计划产生的属性。如果名称重复,则使用最内部作用域中定义的名称。 | ||
ResolveTimeZone | 用会话本地时区的副本替换不含时区 ID 的 TimeZoneAwareExpression。 | ||
ResolveRandomSeed | 设置随机数生成的种子。 | ||
ResolveBinaryArithmetic | 解析二进制算法 对于加法 1. 如果两边都是时间间隔,则保持不变; 2. 否则,如果一边是日期,另一边是时间间隔,则将其转为 DateAddInterval; 3. 否则,如果一边是时间间隔,则将其转为 TimeAdd; 4. 否则,如果一边是日期,则将其转为 DateAdd; 5. 否则保持不变。 减法 1. 如果两边都是时间间隔,则保持不变; 2. 否则,如果左边是日期,右边是区间,则将其转为(l, -r); 3. 否则,如果右边是区间,则将其转为(l, -r); 4. 否则,如果一边是时间戳,则将其转为 SubtractTimestamps; 5. 否则,如果右边是日期,则将其转为 DateDiff/SubtractDates; 6. 否则,如果左边是日期,则将其转为 DateSub; 7. 否则改为保持不变。 乘法 1. 如果一边是区间,则将其转换为 MultiplyInterval; 2. 否则保持不变。 对于除法 1. 如果左边是区间,则将其转为 DivideInterval; 2. 否则,保持不变。 | ||
ResolveUnion | 将 Union 的不同子代解析为一组共同的列。 | ||
RewriteDeleteFromTable | 重写 DELETE 操作的规则,使用对单行或行群组进行操作的计划。 如果表实现了 SupportsDeleteV2 和 SupportsRowLevelOperations,该规则仍将重写 DELETE 操作,但优化器会检查是否可以通过向连接器传递删除筛选器来处理该特定 DELETE 语句。如果可以,优化器将放弃重写的计划,并允许数据源使用过滤器删除。 | ||
typeCoercionRules | 当spark.sql.ansi.enabled 设置为 true 的时候,采取 ANSI 的方式进行解析,这代表的是一组解析规则。 | ||
ResolveWithCTE | 使用相应 CTE 定义的解析输出属性更新 CTE 引用。 | ||
Remove TempResolvedColumn | Once | RemoveTempResolvedColumn | 主解析批次中的 ResolveReferences 规则会在 UnresolvedHaving/ Filter/ Sort 中创建 TempResolvedColumn,用于保存临时解析的带有 agg. 如果托管 TempResolvedColumn 的表达式已完全解析,则规则 ResolveAggregationFunctions 将 - 如果 TempResolvedColumn 位于聚合函数或分组表达式中,则用 AttributeReference 替换 TempResolvedColumn。- 如果 TempResolvedColumn 不在聚合函数或分组表达式中,则将其标记为已尝试,希望其他规则能重新解决它。如果 hasTried 为真,ResolveReferences 将重新解析 TempResolvedColumn,如果解析失败,则保持不变。我们应该将其转回 UnresolvedAttribute,这样分析器稍后就能报告缺少列的错误。 如果托管 TempResolvedColumn 的表达式未被解析,TempResolvedColumn 将保持 hasTried 为 false。我们应该剥离 TempResolvedColumn,这样用户就能看到表达式未解析的原因,例如类型不匹配。 |
Post-Hoc Resolution | Once | ResolveCommandsWithIfExists | 用于在未解析表或临时视图时处理命令的规则。这些命令支持 “ifExists ”标志,因此在未解析关系时不会失败。如果 “ifExists ”标志被设为 true,则该计划将被解析为 NoopCommand. |
Remove Unresolved Hints | Once | RemoveAllHints | 删除所有hits,用于删除用户提供的无效hits。必须在执行完所有其他hits规则后才能执行。 |
Nondeterministic | Once | PullOutNondeterministic | 从非 Project 或过滤器的 LogicalPlan 中提取非确定表达式,将其放入内部 Project,最后将其投射到外部 Project。 |
UDF | Once | HandleNullInputsForUDF | 通过添加额外的 If 表达式来进行空值检查,从而正确处理 UDF 的空基元输入。当用户使用基元参数定义 UDF 时,无法判断基元参数是否为空,因此我们假定基元输入为可传递的空,如果输入为空,则返回空。 |
ResolveEncodersInUDF | 通过明确给出属性来解决 UDF 的编码器问题。我们明确给出属性是为了处理输入值的数据类型与编码器内部模式不一致的情况,这可能会导致数据丢失。例如,如果实际数据类型是 Decimal(30,0),编码器不应将输入值转换为 Decimal(38,18)。 解析后的编码器将用于将内部行反序列化为 Scala 值。 | ||
UpdateNullability | Once | UpdateAttributeNullability | 通过使用子输出属性(Attributes)中相应属性的无效性,更新已解析逻辑计划(LogicalPlan)中属性的无效性。之所以需要这一步骤,是因为用户可以在数据集 API 中使用已解析的 AttributeReference,而外连接可以改变 AttributeReference 的无效性。如果没有这条规则,可空列的可空字段实际上可能会被设置为不可空,从而导致非法优化(如 NULL 传播)和错误答案。 有关这种情况的具体查询,请参见 SPARK-13484 和 SPARK-13801。 |
Subquery | Once | UpdateOuterReferences | 引用外部查询块的子查询中的聚合表达式会被推送到外部查询块进行评估。下面的规则更新了此类外部引用,如 AttributeReference 引用父查询块/外部查询块中的属性。 |
Cleanup | fixedPoint | CleanupAliases | 清除计划中不必要的别名。基本上,我们只需要在 Project(项目列表)或 Aggregate(聚合表达式)或 Window(窗口表达式)中将别名作为顶层表达式。请注意,如果一个表达式有其他不在其子表达式中的表达式参数,如 RuntimeReplaceable,则本规则中的别名转换对这些参数不起作用。 |
HandleSpecialCommand | Once | HandleSpecialCommand | 用于处理分析完成后需要通知的特殊命令的规则。该规则应在所有其他分析规则运行后运行。 |
Remove watermark for batch query | Once | EliminateEventTimeWatermark | 忽略批量查询中的事件时间水印,该功能仅在结构化数据流中支持。TODO:将此规则添加到分析器规则列表中。 |
相关文章:
【Spark源码分析】规则框架- `analysis`分析阶段使用的规则
analysis分析阶段使用的规则 规则批策略规则说明SubstitutionfixedPointOptimizeUpdateFields该规则优化了 UpdateFields 表达式链,因此看起来更像优化规则。但是,在处理深嵌套模式时,UpdateFields 表达式树可能会非常复杂,导致分…...
Windows和Ubuntu系统下cmake和opencv的安装和使用
以下是在Windows和Ubuntu系统下分别安装CMake并使用C配置OpenCV实现读取图片并显示功能的详细步骤: Windows系统 1. 安装CMake 访问CMake官方网站(https://cmake.org/download/)。根据你的Windows系统版本(32位或64位ÿ…...
详解 Qt QtPDF之QPdfPageNavigator 页面跳转
文章目录 前言头文件: 自 Qt 6.4 起继承自: 属性backAvailable : const boolcurrentLocation : const QPointFcurrentPage : const intcurrentZoom : const qrealforwardAvailable : const bool 公共函数QPdfPageNavigator(QObject *parent)virtual ~QPd…...
设计模式之单例
单例可以说是设计模式中最简单的一种模式。但任何一种设计模式都是普遍经验的总结,都有值得思考的地方。所以单例也并不简单,下面让我们慢慢了解它。 单例顾名思义这个类只有一个实例。要做到这点,需要做到以下几点: (…...
笔记软件:我来、思源笔记、Obsidian、OneNote
最近wolai的会员到期了,促使我更新了一下笔记软件。 首先,wolai作为一个笔记软件,我觉得有很多做得不错的方面(否则我也不会为它付费2年了),各种功能集成得很全(公式识别这个功能我写论文的时候…...
前端入门指南:前端模块有哪些格式?分别什么情况使用
前言 在当今的前端开发中,模块化是提升代码组织性和可维护性的关键手段。随着前端技术的发展,出现了多种模块化方案,每种方案都有其独特的优势和适用场景。本文将详细探讨常见的前端模块格式,包括全局变量、IIFE、CommonJS、AMD、…...
Vue3 常用指令解析:v-bind、v-if、v-for、v-show、v-model
Vue 是一个非常强大的前端框架,提供了许多常用指令来简化模板的使用。Vue 指令以 v- 开头,用于对 DOM 元素和组件的行为进行控制。本文将介绍 Vue 中常见的五个指令:v-bind、v-if、v-for、v-show 和 v-model,并通过实例代码来演示…...
如何查看ubuntu服务器的ssh服务是否可用
你可以通过以下几种方法检查 Ubuntu 服务器上的 SSH 服务是否可用: 1. 使用 systemctl 检查 SSH 服务状态 首先,检查 SSH 服务是否正在运行: sudo systemctl status ssh如果 SSH 服务正在运行,你会看到类似以下的输出ÿ…...
redis面试复习
1.redis是单线程还是多线程 无论什么版本工作线程就是是一个,6.x高版本出现了IO多线程 单线程满足redis的串行原子,只不过IO多线程后,把输入/输出放到更多的线程里区并行,好处: 1.执行的时间更短,更快&a…...
【人工智能基础04】线性模型
文章目录 一. 基本知识1. 线性回归1.1. 基本形式1.2. 线性回归 2. 优化方法:梯度下降法2.1. 梯度下降法的直观意义2.2. 随机梯度下降法 3. 分类问题3.1. 二分类:逻辑回归-sigmoid函数3.2. 多分类问题--softmax函数 4. 岭回归与套索回归4.1. 基础概念什么…...
使用YOLO系列txt目标检测标签的滑窗切割:批量处理图像和标签的实用工具
使用YOLO系列txt目标检测标签的滑窗切割:批量处理图像和标签的实用工具 使用YOLO的TXT目标检测标签的滑窗切割:批量处理图像和标签的实用工具背景1. 代码概述2. 滑窗切割算法原理滑窗切割步骤:示例: 3. **代码实现**1. **加载标签…...
《装甲车内气体检测“神器”:上海松柏 K-5S 电化学传感器模组详解》
《装甲车内气体检测“神器”:上海松柏 K-5S 电化学传感器模组详解》 一、引言二、K-5S 电化学传感器模组概述(一)产品简介(二)产品特点(三)产品适用场景 三、电化学传感器原理及优点(一…...
【笔记】文明、现代化与价值投资
文章目录 价值投资与理性思考资管行业特点及对从业人员的道德底线要求价值投资长期来看,各项资产的走势投资与投机 对文明的认知对文明的计量方式狩猎文明或1.0文明农业畜牧文明或2.0文明农业文明的天花板及三次冲顶农业文明中的思想革命和制度创新 科技文明或3.0文…...
排序学习整理(1)
1.排序的概念及运用 1.1概念 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…...
提升分布式系统响应速度:分布式系统远程调用性能提升之道
目录 一、远程调用直接案例分析 二、并行调用 (一)核心思想 (二)并行调用的实现方式 1. 基本思路 2. 代码示例 3. 关键点说明 4.线程池配置建议 三、数据异构 (一)场景重提 (二&…...
通过MinIO+h2non/imaginary 搭建自己的阿里云OSS
安装MinIO Docker部署MinIO对象存储服务 图片访问地址:http://192.168.153.138:9000/public/su7_1.jpg 安装h2non/imaginary Docker部署h2non/imaginary 处理图片地址:http://192.168.153.138:7000/resize?urlhttp://192.168.153.138:9000/public/su…...
.NET 9 AOT的突破 - 支持老旧Win7与XP环境
引言 随着技术的不断进步,微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中,一个特别引人注目的亮点是 AOT( Ahead-of-Time)支持,它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…...
iOS与Windows间传文件
想用数据线从 windows 手提电脑传文件入 iPhone,有点迂回。 参考 [1],要在 windows 装 Apple Devices。装完、打开、插线之后会检测到手机,界面: 点左侧栏「文件」,不是就直接可以传,而是要通过某个应用传…...
ospf协议(动态路由协议)
ospf基本概念 定义 OSPF 是典型的链路状态路由协议,是目前业内使用非常广泛的 IGP 协议之一。 目前针对 IPv4 协议使用的是 OSPF Version 2 ( RFC2328 );针对 IPv6 协议使用 OSPF Version 3 ( RFC2740 )。…...
直击高频编程考点:聚焦新版综合编程能力考查汇总
目录 一、业务性编程和广度能力考查 (一)基本定义 (二)必要性分析 二、高频考查样题(编程扩展问法) 考题1: 用java 代码实现一个死锁用例,说说怎么解决死锁问题?(高…...
爬虫框架快速入门——Scrapy
适用人群:零基础、对网络爬虫有兴趣但不知道从何开始的小白。 什么是 Scrapy? Scrapy 是一个基于 Python 的网络爬虫框架,它能帮助你快速爬取网站上的数据,并将数据保存到文件或数据库中。 特点: 高效:支…...
Springfox、Swagger 和 Springdoc
Springfox、Swagger 和 Springdoc 是用于在 Spring Boot 项目中生成 API 文档的工具,但它们之间有显著的区别和演进关系: 1. Swagger 简介 Swagger 是一个开源项目,旨在为 RESTful APIs 提供交互式文档。最早由 SmartBear 开发,…...
Css、less和Sass(SCSS)的区别详解
文章目录 Css、less和Sass(SCSS)的区别详解一、引言二、CSS 简介1.1、CSS 示例 三、Less 简介2.1、Less 特性2.2、Less 示例 四、Sass(SCSS)简介3.1、Sass 特性3.2、SCSS 示例 五、总结 Css、less和Sass(SCSSÿ…...
新能源汽车充电基础设施短板问题多,如何实现高效、综合、智能化管理?
随着城市经济的发展,人民生活水平的提升,新能源汽车保有量快速增长,而日益增长的新能源汽车需求与充电基础设施建设不平衡的矛盾日益突出。由于停车泊位充电基础设施总量不足、布局待优化、利用效率低、建设运营存在短板问题等原因࿰…...
DBA面试题-1
面临失业,整理一下面试题,找下家继续搬砖 主要参考:https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1, 整形 tinyint,smallint,medumint,int,bigint;分别占用1字节、2字节、3字节…...
LAN,WAN,VLAN,WLAN,VPN了解笔记
局域网LAN---公司的内部网络就是局域网LAN。 提供有线连接的接口允许局域网内的设备(如台式电脑、网络打印机、网络存储设备等)通过以太网线连接到路由器并与其他局域网设备进行通信实现设备之间的数据传输和资源共享一种私有的网络相对其他网络传输速度…...
1.2 算法和算法评价
1.2.1 算法的基本概念 算法:对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。 算法的五个重要特性 “好”的算法的五个目标 1.2.2 算法效率的度量 一、时间复杂度 算法的时间复杂度是指一个算法每行…...
各大常见编程语言应用领域
不同编程语言因其特性和设计目标而适用于不同的应用领域。以下是一些常见编程语言及其主要应用领域: 1. Python 数据科学与人工智能:Python 在数据分析、机器学习、深度学习等领域广泛使用,因其丰富的库(如 NumPy、Pandas、Tens…...
【FFT】数据点数是否一定为2的n次方?不补零会如何处理?
一般来说,FFT的数据点个数为以2为基数的整数次方(采用以2为基的FFT算法,可以提升运算性能),但是并没有要求FFT的数据点个数一定为2的n次方。 因此针对数据点数不是以2为基数的整数次方,有两种处理方法&…...
shell脚本小练习#003:查找并拷贝目录
实例1: # 从当前执行脚本的路径位置开始向上搜索一个名为sourceProject目录名 # 并将这个文件目录的路径名称打印出来#!/bin/bashfunction find_dir() {local current_dir$PWDwhile [[ $current_dir ! "/" ]]; doif [[ -d "${current_dir}/sourcePr…...
frp内网穿透
目录 1,准备公网服务器 2,下载安装frp服务端 3,服务端安装 2)编辑服务端配置文件fprs.toml 3)配置启动服务 4)启动服务 5 )设置开机启动服务 6)查看服务启动状态 3,…...
Android电视项目焦点跨层级流转
1. 背景 在智家电视项目中,主要操作方式不是触摸,而是遥控器,通过Focus进行移动,确定点击进行的交互,所以在电视项目中焦点、选中、确定、返回这几个交互比较重要。由于电视屏比较大,在一些复杂页面中会存…...
时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法
目录 基本介绍程序设计参考资料获取方式基本介绍 时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x =...
转载 为nautilus安装rabbitvcs
# 添加 rabbitvcs 的 ppa 源 sudo add-apt-repository ppa:rabbitvcs/ppa sudo apt update # 安装 rabbitvcs sudo apt install rabbitvcs-cli rabbitvcs-core rabbitvcs-gedit rabbitvcs-nautilus # 注销后重新登录,右键即可使用 # 解决 RabbitVCS 无法自动保存…...
OpenCV 模板匹配全解析:从单模板到多模板的实战指南
简介:本文深入探讨 OpenCV 中的模板匹配技术。详细介绍构建输入图像与模板图像的步骤,包括读取、截取、滤波与存储等操作。剖析 cv2.matchTemplate 语法及其参数含义,阐述不同匹配方法下结果值的意义。同时讲解 cv2.minMaxLoc 语法࿰…...
手机控制载货汽车一键启动无钥匙进入广泛应用
移动管家载货汽车一键启动无钥匙进入手机控车系统, 该系统广泛应用于物流运输、工程作业等货车场景,为车主提供了高效、便捷的启动和熄火解决方案,体现了科技进步对物流行业的积极影响 核心功能:简化启动流程,提…...
Springboot——SseEmitter流式输出
文章目录 前言SseEmitter 简介测试demo注意点异常一 ResponseBodyEmitter is already set complete 前言 最近做AI类的开发,看到各大AI模型的输出方式都是采取的一种EventStream的方式实现。 不是通常的等接口处理完成后,一次性返回。 而是片段式的处理…...
【人工智能数学基础篇】线性代数基础学习:深入解读矩阵及其运算
矩阵及其运算:人工智能入门数学基础的深入解读 引言 线性代数是人工智能(AI)和机器学习的数学基础,而矩阵作为其核心概念之一,承担着数据表示、变换和运算的重任。矩阵不仅在数据科学中广泛应用,更是神经…...
idea 自动导包,并且禁止自动导 *(java.io.*)
自动导包配置 进入 idea 设置,可以按下图所示寻找位置,也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly:自动帮我们优化导入的包Optimize imports on the fly:自动去掉一些没有用到的包 禁止导…...
奇怪的编码2
1.当铺密码 当铺密码的标志是“田由中人工大王夫井羊” 口 0 田 0 由 1 中 2 人 3 工 4 大 5 王 6 夫 7 井 8 羊 9 解密脚本: s 田由中人工大王夫井羊 codeinput("请输入当铺密码:") code code.split(" ") w for i in code:k…...
AI服务器从HBM到CXL的技术变革
AI服务器从HBM到CXL变革 本文探讨了AI产业的新范式,特别是服务器变革。传统服务器价格通常在1万美金以内,而搭载8张H100算力卡的DGX H100AI服务器价值高达40万美金(约300万人民币)。这一变化将对AI产业产生深远影响。 自然语言和图形处理依赖大量存储器…...
将自定义 AWS S3 快照存储库连接到 Elastic Cloud
作者:来自 Elastic Annie Hansen, Stef Nestor 在本博客中,我们将介绍如何通过 Elasticsearch 的快照将我们已提交的集群数据备份到 AWS S3 存储桶中。在 Elastic Cloud(企业版)中,Elastic 在其 found-snapshots 存储…...
Java 多线程编程核心要点全解析:深度探秘关键方法与同步机制
1.Thread 类中的start() 和 run() 方法有什么区别? 在Java编程语言中,Thread 类的 start() 和 run() 方法有重要的区别: start() 方法: 当你调用 start() 方法时,它会启动一个新的线程,并且这个新线程会…...
个人博客接入github issue风格的评论,utteranc,gitment
在做个人博客的时候,如果你需要评论功能,但是又不想构建用户体系和评论模块,那么可以直接使用github的issue提供的接口,对应的开源项目有utteranc和gitment,尤其是前者。 它们的原理是一样的:在博客文章下…...
搞个项目之-esp32-cam ov2640模组搭建图像视频项目
开发版的介绍: 1、开发板使用的是:ESP32-CAM 2、摄像头模组:OV2640 3、烧录底座:ESP32-CAM开发板烧录座 4、mirco usb线,四线30cm 5、开发版的原理图像 项目前期的准备工作 一、安装arduino arduino官网地址地址…...
【FPGA开发】Vivado自定义封装IP核,绑定总线
支持单个文件的封装、整个工程的封装,这里用单个文件举例。 在文件工程目录下,自建一个文件夹,里面放上需要封装的verilog文件。 选择第三个,指定路径封装,找到文件所在目录 取个名,选择封装IP的路径 会…...
Leetcode51:N 皇后
题目描述: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问…...
C#面向对象之访问限制,类基础,继承
文章目录 1 访问限制1.1 简介 2 类基础讲解2.1 类定义2.2 构造函数2.2.1 构造函数2.2.2 静态构造函数2.2.3 初始化顺序2.2.4 对象初始化器 2.3 析构函数2.4 类的静态成员2.5 匿名对象2.5.1 定义2.5.2 匿名对象的创建 3 继承3.1 基类和派生类3.2 基类初始化3.3 Partial类3.3.1 定…...
科研小白成长记41——享受大起大落
一直内心对自己的定位是喜欢安安静静生活的人,但是朋友提醒我我的生活一直都是出于各种冒险之中,从GAP申博,到GAP找工作,都不是一个乐于安于现状的人会做出来的。仔细想想不无道理,既然如此,那就如享受安静…...
正则表达式笔记
一、基本正则 常见元字符 元字符说明^以某个字符开头$以某个字符结尾.匹配任意单字符*对前一项进行0次或者多次重复匹配{m,n}将前一项字符重复m-n次,{m,},{,n},{m,n}[]对方括号内的单字符进行匹配[^]不匹配方括号内的单字符^[]匹配以某个字符开头的行(…...