编写网站代码,网站制作公司有哪些,科技侠智能锁,衡水精品网站建设报价analysis分析阶段使用的规则
规则批策略规则说明SubstitutionfixedPointOptimizeUpdateFields该规则优化了 UpdateFields 表达式链#xff0c;因此看起来更像优化规则。但是#xff0c;在处理深嵌套模式时#xff0c;UpdateFields 表达式树可能会非常复杂#xff0c;导致分…analysis分析阶段使用的规则
规则批策略规则说明SubstitutionfixedPointOptimizeUpdateFields该规则优化了 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 HintsOnceDisableHints当设置了 spark.sql.optimizer.disableHints 时删除所有提示。这将在分析器开始时执行以禁用提示功能。HintsfixedPointResolveJoinStrategyHints允许的连接策略提示列表在 JoinStrategyHint.strategies 中定义连接策略提示可以指定关系别名序列例如 “MERGE(a, c)”、“BROADCAST(a)”。连接策略提示计划节点将被插入任何与指定名称相匹配的关系没有不同的别名、子查询或公共表表达式的顶部。提示解析的工作方式是向下递归遍历查询计划找到与指定关系别名之一匹配的关系或子查询。遍历不会超出任何视图引用、子查询别名。该规则必须在普通表表达式之前执行。ResolveCoalesceHintsCOALESCE Hint 提示接受名称 “COALESCE”、“REPARTITION ”和 “REPARTITION_BY_RANGE”。Simple Sanity CheckOnceLookupFunctions检查 UnresolvedFunction 引用的函数标识符是否在函数注册表中定义。请注意该规则不会尝试解析 UnresolvedFunction。它只是根据函数标识符执行简单的存在性检查以快速识别未定义的函数而不会触发关系解析这在某些情况下可能会导致昂贵的分区/模式发现过程。为了避免重复查找外部函数外部函数标识符将存储在本地哈希集 externalFunctionNameSet 中。Keep Legacy OutputsOnceKeepLegacyOutputsspark.sql.legacy.keepCommandOutputSchema为true时保留 SQL 命令传统输出的规则。ShowTablesShowNamespacesDescribeNamespaceShowTableProperties。ResolutionfixedPointResolveCatalogs解析table/view/function/namespace的名称部分目录。ResolveUserSpecifiedColumns解析用户指定的列。当用户在 INSERT INTO 中指定列列表时为 DSv1 提供了重新排列列顺序的特殊规则。DSv2 由 Analyzer.ResolveInsertInto 单独处理。ResolveInsertInto 单独处理。ResolveInsertInto解析INSERT INTO语句ResolveRelations用catalog中的具体关系替换未解决的关系表和视图。ResolvePartitionSpec在分区相关命令中将UnresolvedPartitionSpec解析成ResolvedPartitionSpec。ResolveFieldNameAndPosition根据命令的大小写敏感性解析、规范化和重写字段名称的规则。AddMetadataColumns当节点缺少已解析的属性时为子关系的输出添加元数据列。元数据列的引用是使用 LogicalPlan.metadataOutput 中的列来解析的但在关系被替换之前关系的输出不包括元数据列。除非此规则将元数据添加到关系的输出中否则分析器会检测到没有产生这些列。只有当节点已解析但缺少其子节点的输入时该规则才会添加元数据列。这样可以确保除非使用了元数据列否则不会将其添加到计划中。通过只检查已解析的节点可确保 * 扩展已完成这样元数据列就不会被 * 意外选中。此规则会向下解析操作符以避免过早投影出元数据列。DeduplicateRelationsLogicalPlan的关系去重ResolveReferences解析查询计划中的列引用。基本上它会自下而上地转换查询计划树只有当一个计划节点的所有子节点都已解析且子节点之间不存在冲突属性时才会尝试解析该节点的引用详见 hasConflictingAttrs。ResolveLateralColumnAliasReference该规则是解决横向列别名的第二阶段。解析横向列别名它引用了之前在 SELECT 列表中定义的别名。从计划角度看它处理两种类型的操作符 项目和聚合。- 在 “项目 ”中将引用的横向别名下推到新创建的 “项目 ”中解析引用这些别名的属性 - 在 “聚合 ”中在上面插入 “项目 ”节点并返回到 “项目 ”的解析。ResolveExpressionsWithNamePlaceholders如果表达式中包含 NamePlaceholders则解析表达式。NamePlaceholders代表的是占位符的ResolveDeserializer用已解析为给定输入属性的反序列化表达式替换 UnresolvedDeserializer。ResolveNewInstance如果正在构造的对象是一个内部类则通过查找并添加外部作用域来解决 NewInstance 问题。ResolveUpCast用 Cast 替换 UpCast 表达式并在可能截断的情况下抛出异常。ResolveGroupingAnalytics解析grouping函数ResolvePivot解析PivotResolveUnpivot解析UnpivotResolveOrdinalInOrderByAndGroupBy在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检查和添加顺序到AggregateWindowFunctionResolveWindowFrame检查并为所有窗口功能添加合适的窗口框架。ResolveNaturalAndUsingJoin根据两侧的输出计算输出列消除自然连接或使用连接然后在普通连接上应用 Project 消除自然连接或使用连接。ResolveOutputRelation根据逻辑计划中的数据解析输出表的列。该规则将- 按名称写入时重新排列列顺序 - 在数据类型不匹配时插入转换 - 在列名不匹配时插入别名 - 检测与输出表不兼容的计划并抛出 AnalysisExceptionExtractWindowExpressions从 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替换UnresolvedInlineTableResolveLambdaVariables解决高阶函数公开的 lambda 变量。该规则分两步运行 [1]. 将高阶函数公开的匿名变量绑定到 lambda 函数的参数上这样就创建了命名和类型化的 lambda 变量。在这一步中将检查参数名称是否重复并检查参数的数量。[2]. 解析 lambda 函数的函数表达式树中使用的 lambda 变量。请注意我们允许使用当前 lambda 之外的变量这些变量可以是定义在外层作用域中的 lambda 函数也可以是由计划的子计划产生的属性。如果名称重复则使用最内部作用域中定义的名称。ResolveTimeZone用会话本地时区的副本替换不含时区 ID 的 TimeZoneAwareExpression。ResolveRandomSeed设置随机数生成的种子。ResolveBinaryArithmetic解析二进制算法对于加法 1. 如果两边都是时间间隔则保持不变 2. 否则如果一边是日期另一边是时间间隔则将其转为 DateAddInterval 3. 否则如果一边是时间间隔则将其转为 TimeAdd4. 否则如果一边是日期则将其转为 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 TempResolvedColumnOnceRemoveTempResolvedColumn主解析批次中的 ResolveReferences 规则会在 UnresolvedHaving/ Filter/ Sort 中创建 TempResolvedColumn用于保存临时解析的带有 agg.如果托管 TempResolvedColumn 的表达式已完全解析则规则 ResolveAggregationFunctions 将 - 如果 TempResolvedColumn 位于聚合函数或分组表达式中则用 AttributeReference 替换 TempResolvedColumn。- 如果 TempResolvedColumn 不在聚合函数或分组表达式中则将其标记为已尝试希望其他规则能重新解决它。如果 hasTried 为真ResolveReferences 将重新解析 TempResolvedColumn如果解析失败则保持不变。我们应该将其转回 UnresolvedAttribute这样分析器稍后就能报告缺少列的错误。如果托管 TempResolvedColumn 的表达式未被解析TempResolvedColumn 将保持 hasTried 为 false。我们应该剥离 TempResolvedColumn这样用户就能看到表达式未解析的原因例如类型不匹配。Post-Hoc ResolutionOnceResolveCommandsWithIfExists用于在未解析表或临时视图时处理命令的规则。这些命令支持 “ifExists ”标志因此在未解析关系时不会失败。如果 “ifExists ”标志被设为 true则该计划将被解析为 NoopCommand.Remove Unresolved HintsOnceRemoveAllHints删除所有hits用于删除用户提供的无效hits。必须在执行完所有其他hits规则后才能执行。NondeterministicOncePullOutNondeterministic从非 Project 或过滤器的 LogicalPlan 中提取非确定表达式将其放入内部 Project最后将其投射到外部 Project。UDFOnceHandleNullInputsForUDF通过添加额外的 If 表达式来进行空值检查从而正确处理 UDF 的空基元输入。当用户使用基元参数定义 UDF 时无法判断基元参数是否为空因此我们假定基元输入为可传递的空如果输入为空则返回空。ResolveEncodersInUDF通过明确给出属性来解决 UDF 的编码器问题。我们明确给出属性是为了处理输入值的数据类型与编码器内部模式不一致的情况这可能会导致数据丢失。例如如果实际数据类型是 Decimal(30,0)编码器不应将输入值转换为 Decimal(38,18)。解析后的编码器将用于将内部行反序列化为 Scala 值。UpdateNullabilityOnceUpdateAttributeNullability通过使用子输出属性Attributes中相应属性的无效性更新已解析逻辑计划LogicalPlan中属性的无效性。之所以需要这一步骤是因为用户可以在数据集 API 中使用已解析的 AttributeReference而外连接可以改变 AttributeReference 的无效性。如果没有这条规则可空列的可空字段实际上可能会被设置为不可空从而导致非法优化如 NULL 传播和错误答案。有关这种情况的具体查询请参见 SPARK-13484 和 SPARK-13801。SubqueryOnceUpdateOuterReferences引用外部查询块的子查询中的聚合表达式会被推送到外部查询块进行评估。下面的规则更新了此类外部引用如 AttributeReference 引用父查询块/外部查询块中的属性。CleanupfixedPointCleanupAliases清除计划中不必要的别名。基本上我们只需要在 Project项目列表或 Aggregate聚合表达式或 Window窗口表达式中将别名作为顶层表达式。请注意如果一个表达式有其他不在其子表达式中的表达式参数如 RuntimeReplaceable则本规则中的别名转换对这些参数不起作用。HandleSpecialCommandOnceHandleSpecialCommand用于处理分析完成后需要通知的特殊命令的规则。该规则应在所有其他分析规则运行后运行。Remove watermark for batch queryOnceEliminateEventTimeWatermark忽略批量查询中的事件时间水印该功能仅在结构化数据流中支持。TODO将此规则添加到分析器规则列表中。