Spark Optimizer 规则详解和示例

Optimizer 是在 Analyzer 生成 Resolved Logical Plan 后,进行优化的阶段。

1. Batch Finish Analysis

有5条优化规则,这些规则都执行一次

1.1 EliminateSubqueryAliases

消除查询别名,对应逻辑算子树中的 SubqueryAlias 节点。一般来讲,Subqueries 仅用于提供查询的视角范围信息,一旦 Analyzer 阶段结束,该节点就可以被删除,该优化规则直接将 SubqueryAlias 替换为其子节点。
如下SQL,子查询 alias 为 t,在 Analyzed Logical Plan 中,还有 SubqueryAlias t节点。

explain extended select sum(len) from ( select c1,length(c1) len  from t1 group by c1) t;
== Analyzed Logical Plan ==
sum(len): bigint
Aggregate [sum(len#56) AS sum(len)#64L]
+- SubqueryAlias t+- Aggregate [c1#62], [c1#62, length(c1#62) AS len#56]+- SubqueryAlias spark_catalog.test.t1+- HiveTableRelation [`test`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#62], Partition Cols: []]== Optimized Logical Plan ==
Aggregate [sum(len#56) AS sum(len)#64L]
+- Aggregate [c1#62], [length(c1#62) AS len#56]+- HiveTableRelation [`test`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#62], Partition Cols: []]

1.2 ReplaceExpressions

ReplaceExpressions 表达式替换。
4个替换规则,如下所示。

case e: RuntimeReplaceable => e.childcase CountIf(predicate) => Count(new NullIf(predicate, Literal.FalseLiteral))case BoolOr(arg) => Max(arg)case BoolAnd(arg) => Min(arg)

1.2.1 RuntimeReplaceable

RuntimeReplaceable 是一个 trait,有好多子类,用 child 节点把自己替换。如 Nvl 的child是 Coalesce(Seq(left, right))。那么优化的时候用 child 替换 nvl 。

case class Nvl(left: Expression, right: Expression, child: Expression) extends RuntimeReplaceable {def this(left: Expression, right: Expression) = {this(left, right, Coalesce(Seq(left, right)))}
explain extended SELECT nvl(c1,c2) FROM VALUES ('v1', 'v12'), ('v2', 'v22'), ('v3', 'v32') AS tab(c1, c2);

输出结果

== Analyzed Logical Plan ==
nvl(c1, c2): string
Project [nvl(c1#85, c2#86) AS nvl(c1, c2)#87]
+- SubqueryAlias tab+- LocalRelation [c1#85, c2#86]== Optimized Logical Plan ==
LocalRelation [nvl(c1, c2)#87]

1.2.2 bool_or

用max替换 bool_or.

explain extended SELECT bool_or(col) FROM 
VALUES (true), (false), (false) AS tab(col);

输出结果

== Analyzed Logical Plan ==
bool_or(col): boolean
Aggregate [bool_or(col#101) AS bool_or(col)#103]
+- SubqueryAlias tab+- LocalRelation [col#101]== Optimized Logical Plan ==
Aggregate [max(col#101) AS bool_or(col)#103]
+- LocalRelation [col#101]

1.2.3 bool_and

用 min 替换 bool_and.

explain extended SELECT bool_and(col) FROM 
VALUES (true), (false), (false) AS tab(col);

输出结果:

== Analyzed Logical Plan ==
bool_and(col): boolean
Aggregate [bool_and(col#112) AS bool_and(col)#114]
+- SubqueryAlias tab+- LocalRelation [col#112]== Optimized Logical Plan ==
Aggregate [min(col#112) AS bool_and(col)#114]
+- LocalRelation [col#112]

1.3 ComputeCurrentTime

计算当前时间相关的表达式,在同一条 SQL 中可能包含多个计算时间的表达式,如 CurentDate 和 CurrentTimestamp,保证同一个 SQL query 中多个表达式返回相同的值。

subQuery.transformAllExpressionsWithPruning(transformCondition) {case cd: CurrentDate =>Literal.create(DateTimeUtils.microsToDays(currentTimestampMicros, cd.zoneId), DateType)case CurrentTimestamp() | Now() => currentTimecase CurrentTimeZone() => timezonecase localTimestamp: LocalTimestamp =>val asDateTime = LocalDateTime.ofInstant(instant, localTimestamp.zoneId)Literal.create(localDateTimeToMicros(asDateTime), TimestampNTZType)}

2. BatchUnion

Combine Union,把相邻的 union 节点可以合并为一个 union 节点,如以下SQL.

explain extended 
select c1 from t1 
union 
select c1 from t1 where length(c1) = 2 
union 
select c1 from t1 where length(c1) = 3;

输出结果如下, Analyzed Logical Plan 有2个 Union,Optimized Logical Plan 有 1 个 Union.

== Analyzed Logical Plan ==
c1: string
Distinct
+- Union false, false:- Distinct:  +- Union false, false:     :- Project [c1#161]:     :  +- SubqueryAlias spark_catalog.test.t1:     :     +- HiveTableRelation [`test`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#161], Partition Cols: []]:     +- Project [c1#162]:        +- Filter (length(c1#162) = 2):           +- SubqueryAlias spark_catalog.test.t1:              +- HiveTableRelation [`test`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#162], Partition Cols: []]+- Project [c1#163]+- Filter (length(c1#163) = 3)+- SubqueryAlias spark_catalog.test.t1+- HiveTableRelation [`test`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#163], Partition Cols: []]== Optimized Logical Plan ==
Aggregate [c1#161], [c1#161]
+- Union false, false:- HiveTableRelation [`test`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#161], Partition Cols: []]:- Filter (isnotnull(c1#162) AND (length(c1#162) = 2)):  +- HiveTableRelation [`test`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#162], Partition Cols: []]+- Filter (isnotnull(c1#163) AND (length(c1#163) = 3))+- HiveTableRelation [`test`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#163], Partition Cols: []]

3. Batch Subquery

3.1 OptimizeSubqueries

当SQL语句包含子查询时,会在逻辑算子树上生成 SubqueryExpression 表达式。OptimizeSubqueries 优化规则在遇到 SubqueryExpression 表达式时,进一步调用 Optimizer 对该表达式的子计划进行优化。

4. Batch Replace Operators

用来执行算子的替换操作。在SQL语句中,某些查询算子可以直接改写为已有的算子,避免进行重复的逻辑转换。

4.1 ReplaceIntersectWithSemiJoin

将 Intersect 操作算子替换为 Left-Semi Join 操作算子,从逻辑上来看,这两种算子是等价的。需要注意的是,ReplaceIntersectWithSemiJoin 仅适用于 INTERSECT DISTINCT 类型的语句,不适用于 INTERSECT ALL 语句。此外,该优化规则执行之前必须消除重复的属性,避免生成的 Join 条件不正确。
示例:

create table t1(c1 string) stored as textfile;
create table t2(c1 string) stored as textfile;
load data local inpath '/etc/profile' overwrite into table t1;
load data local inpath '/etc/profile' overwrite into table t2;

查找长度为4的。

 select c1 from t1 where length(c1)=4;

输出结果:

else
else
else
done
Time taken: 0.064 seconds, Fetched 4 row(s)
  • intersect distinct
explain extended 
select  c1 from t2 where length(c1)<5 
intersect distinct 
select c1 from t1 where length(c1)=4;

输出结果如下,可以看到,Analyzed Logical Plan 中,为 Intersect,而 Optimized Logical Plan 变为 Join LeftSemi

== Analyzed Logical Plan ==
c1: string
Intersect false
:- Project [c1#149]
:  +- Filter (length(c1#149) < 5)
:     +- SubqueryAlias spark_catalog.hzz.t2
:        +- HiveTableRelation [`hzz`.`t2`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#149], Partition Cols: []]
+- Project [c1#150]+- Filter (length(c1#150) = 4)+- SubqueryAlias spark_catalog.hzz.t1+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#150], Partition Cols: []]== Optimized Logical Plan ==
Aggregate [c1#149], [c1#149]
+- Join LeftSemi, (c1#149 <=> c1#150):- Filter (isnotnull(c1#149) AND (length(c1#149) < 5)):  +- HiveTableRelation [`hzz`.`t2`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#149], Partition Cols: []]+- Filter (isnotnull(c1#150) AND (length(c1#150) = 4))+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#150], Partition Cols: []]

4.2 ReplaceExceptWithAntiJoin

用 AntiJoin 替换 Except。
示例如下:

explain extended 
select  c1 from t2 where length(c1) <=5 
except 
select c1 from t1 where length(c1)=4;

输出结果:

== Analyzed Logical Plan ==
c1: string
Except false
:- Project [c1#156]
:  +- Filter (length(c1#156) <= 5)
:     +- SubqueryAlias spark_catalog.hzz.t2
:        +- HiveTableRelation [`hzz`.`t2`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#156], Partition Cols: []]
+- Project [c1#157]+- Filter (length(c1#157) = 4)+- SubqueryAlias spark_catalog.hzz.t1+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#157], Partition Cols: []]== Optimized Logical Plan ==
Aggregate [c1#156], [c1#156]
+- Join LeftAnti, (c1#156 <=> c1#157):- Filter (isnotnull(c1#156) AND (length(c1#156) <= 5)):  +- HiveTableRelation [`hzz`.`t2`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#156], Partition Cols: []]+- Filter (isnotnull(c1#157) AND (length(c1#157) = 4))+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#157], Partition Cols: []]

4.3 RelaceDistinctWithAggregate

示例:

explain extended 
select distinct c1 from t1;

输出结果如下:

== Analyzed Logical Plan ==
c1: string
Distinct
+- Project [c1#163]+- SubqueryAlias spark_catalog.hzz.t1+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#163], Partition Cols: []]== Optimized Logical Plan ==
Aggregate [c1#163], [c1#163]
+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#163], Partition Cols: []]

5. Batch Aggregate

5.1 RemoveLiteralFromGroupExceptions

去除 group by中的常数。
示例:group by 都是常数,用 0 替代

explain extended 
select sum(length(c1)) from t1 group by 'aa','bb';
== Analyzed Logical Plan ==
sum(length(c1)): bigint
Aggregate [aa, bb], [sum(length(c1#189)) AS sum(length(c1))#191L]
+- SubqueryAlias spark_catalog.hzz.t1+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#189], Partition Cols: []]== Optimized Logical Plan ==
Aggregate [0], [sum(length(c1#189)) AS sum(length(c1))#191L]
+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#189], Partition Cols: []]

5.2 RemoteRepetitionFromGroupExpressions

去除 group by 中重复的表达式,如

explain extended 
select sum(length(c1)) from t1 group by c1,c1;

输出结果

== Analyzed Logical Plan ==
sum(length(c1)): bigint
Aggregate [c1#201, c1#201], [sum(length(c1#201)) AS sum(length(c1))#203L]
+- SubqueryAlias spark_catalog.hzz.t1+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#201], Partition Cols: []]== Optimized Logical Plan ==
Aggregate [c1#201], [sum(length(c1#201)) AS sum(length(c1))#203L]
+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#201], Partition Cols: []]

6. Batch Operator Optimizations

包括3大分类。1. 算子下推。2. 算子组合。3. 常量折叠与长度消减。
算子下推:谓词下推,列裁剪。
算子组合:

优化规则优化操作
PushProjectionThroughUnion列裁剪下推
ReorderJoinJoin 顺序优化,和 CostBasedJoinReorder 没有关系
EliminateOuterJoin消除 OuterJoin
PushPredicateThroughJoin谓词下推到Join 算子
PushDownPredicate谓词下推
LimitPushDownLimit 算子下推
ColumnPruning列剪裁
InferFiltersFromConstraints
CollapseRepartition重分区组合
CollapseProject投影算子组合
CollapseWindowWindow 组合
CombineFilters投影算子组合
CombineLimitsLimit算子组合
CombineUnionsUnion算子组合
NullPropagationNull 提取
FoldablePropagation可折叠算子提取
OptimizeInIn 操作优化
ConstantFolding常数折叠
ReorderAssociativeOperator重排序关联算子优化
LikeSimplificationLike 算子简化
BooleanSimplificationBoolean 算子简化
SimplifyConditionals条件简化
RemoveDispensableExpressionsDispensable 表达式消除
SimplifyBianryComparison比较算子简化
PruneFilter过滤条件剪裁
EliminateSorts排序算子消除
SimplifyCastsCast 算子简化
SimplifyCaseConversionExpressionsCase 表达式简化
RewriteCorrelatedScalarSubquery依赖子查询重写
EliminateSerialization序列化消除
RemoveAliasOnlyPorject消除别名

InferFiltersFromConstraints

explain extended 
select t1.c1 from t1 join t2 
on t1.c1=t2.c1 
where t2.c1='done';

通过 t2.c1 = t1.c1 并且t2.c1=‘done’ 推测出 t1.c1=‘done’.

== Analyzed Logical Plan ==
c1: string
Project [c1#235]
+- Filter (c1#236 = done)+- Join Inner, (c1#235 = c1#236):- SubqueryAlias spark_catalog.hzz.t1:  +- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#235], Partition Cols: []]+- SubqueryAlias spark_catalog.hzz.t2+- HiveTableRelation [`hzz`.`t2`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#236], Partition Cols: []]== Optimized Logical Plan ==
Project [c1#235]
+- Join Inner, (c1#235 = c1#236):- Filter ((c1#235 = done) AND isnotnull(c1#235)):  +- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#235], Partition Cols: []]+- Filter (isnotnull(c1#236) AND (c1#236 = done))+- HiveTableRelation [`hzz`.`t2`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#236], Partition Cols: []]

ConstantFolding

Analyzed Logical Plan中 Filter 中还是 (1 + (2 * 3),在 Optimized Logical Plan 变为了具体的值 7.

explain extended 
select  c1 from t1 where length(c1)> 1+2*3;
== Analyzed Logical Plan ==
c1: string
Project [c1#266]
+- Filter (length(c1#266) > (1 + (2 * 3)))+- SubqueryAlias spark_catalog.hzz.t1+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#266], Partition Cols: []]== Optimized Logical Plan ==
Filter (isnotnull(c1#266) AND (length(c1#266) > 7))
+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#266], Partition Cols: []]

RemoveDispensableExpressions

如以下SQL 1 < 2 可以消除。

explain extended 
select  c1 from t1 where 1 < 2 and length(c1) = 4;
== Analyzed Logical Plan ==
c1: string
Project [c1#272]
+- Filter ((1 < 2) AND (length(c1#272) = 4))+- SubqueryAlias spark_catalog.hzz.t1+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#272], Partition Cols: []]== Optimized Logical Plan ==
Filter (isnotnull(c1#272) AND (length(c1#272) = 4))
+- HiveTableRelation [`hzz`.`t1`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, Data Cols: [c1#272], Partition Cols: []]

7. Batch Check Cartesian Products

CheckCartesianProducts 判断逻辑算子树是否存在迪卡尔类型的 Join 操作。当存在这样的操作,而SQL中没有显示的使用 cross join 表达式,则会抛出异常。当spark.sql.crossJoin.enabledtrue时,该规则会被忽略。

8. Batch Decimal Optimizations =>DecimalAggregates

一般情况下,如果聚和查询中涉及浮点数的精度处理,性能就会受到很大的影响。对于固定精度的 Decinal 类型,DecimalAggregates 规则将其当做 unscaledLong 类型来执行,这样可以加速聚和操作的速度。

9. BatchTyped Filter Optimization => CombineTypedFilters

当逻辑算子树中存在两个 TypedFilter 过滤条件且针对同类型的对象条件时,CombineTypeFilters 优化规则会将他们合并到同一个过滤函数中。

10. Batch LocalRelation

ConvertToLocalRelation 将一个 LocalRelation 上的本地操作转化为另一个 LocalRelation
VALUES ('v1', 'v12'), ('v2', 'v22'), ('v3', 'v32') AS tab(c1, c2) 就是一个local relation。

explain extended SELECT c1 FROM VALUES ('v1', 'v12'), ('v2', 'v22'), ('v3', 'v32') AS tab(c1, c2) where c1='v1';

输出结果, Parsed Logical Plan 中转化为 UnresolvedInlineTable。在Analyzed Logical Plan 中 UnresolvedInlineTable 转化为 LocalRelation。Optimized Logical Plan 变成仅有一个 LocalRelation,把 LocalRelation 和其上的操作转化为一个新的 LocalRelation。

== Parsed Logical Plan ==
'Project ['c1]
+- 'Filter ('c1 = v1)+- 'SubqueryAlias tab+- 'UnresolvedInlineTable [c1, c2], [[v1, v12], [v2, v22], [v3, v32]]== Analyzed Logical Plan ==
c1: string
Project [c1#323]
+- Filter (c1#323 = v1)+- SubqueryAlias tab+- LocalRelation [c1#323, c2#324]== Optimized Logical Plan ==
LocalRelation [c1#323]

PropageEmptyRelation 对空的 LocalRelation 进行折叠。

 explain extended select t1.c1 from (SELECT c1 FROM VALUES ('v1', 'v12'), ('v2', 'v22'), ('v3', 'v32') AS tab(c1, c2) where c1='v4')t1 join (SELECT c1 FROM VALUES ('v1', 'v12'), ('v2', 'v22'), ('v3', 'v32') AS tab(c1, c2) where c1='v4' )t2 where t1.c1=t2.c1;

结果如下, Analyzed Logical Plan 还有两个子查询做 join 操作。
到了 Optimized Logical Plan 中,仅有一个LocalRelation <empty>,标记 LocalRelation 是空的。因为两个子查询经过优化后都是 LocalRelation <empty>,join 后也是 LocalRelation <empty>

== Analyzed Logical Plan ==
c1: string
Project [c1#337]
+- Filter (c1#337 = c1#339)+- Join Inner:- SubqueryAlias t1:  +- Project [c1#337]:     +- Filter (c1#337 = v4):        +- SubqueryAlias tab:           +- LocalRelation [c1#337, c2#338]+- SubqueryAlias t2+- Project [c1#339]+- Filter (c1#339 = v4)+- SubqueryAlias tab+- LocalRelation [c1#339, c2#340]== Optimized Logical Plan ==
LocalRelation <empty>, [c1#337]== Physical Plan ==
LocalTableScan <empty>, [c1#337]

11. Batch OptimizeCodegen => OptimizeCodegen

现在 Optimize 里已经没有 OptimizeCodegen 规则。

12. Batch RewriteSubquery

包含 RewritePredicateSubquery 和 CollapseProject 两条优化规则。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云云服务器评测|基于华为云云耀云服务器L实例开展性能评测,例如 MySQL、Clickhouse、Elasticsearch等等

在当今云计算时代&#xff0c;越来越多的企业和个人开始选择将应用部署在云服务器上&#xff0c;以便更好地满足高性能、可靠性和可扩展性等需求。而华为云云耀云服务器L实例不仅提供了高性能和可靠性的计算和存储资源&#xff0c;而且具有灵活和高效的成本控制&#xff0c;深受…

QT/C++获取电脑系统,主板型号,CPU型号,硬盘型号,内存大小等相关信息(二)通过Windows Server (WMI)查询

Qt/C++调用windows Api库通过wmi的方式查询电脑能获取更多详细信息,也更加合理有技术性。 建议使用MSCV编译器,如MSCV 2017 ,Qt版本 : 5.13.1 目录导读 关于 WMI示例:创建 WMI 应用程序示例:打印Wmi执行的查询项的所有属性头文件引用项:输出类型转换执行查询通过Windows P…

DDR2 IP核调试记录1

一、IP核生成不成功可能原因 1、打开 Quartus II 软件时&#xff0c;请右键选择以管理员方式运行&#xff0c;切记&#xff0c;否则可能导致 IP 生成不成功。 2、创建工程时不要将工程创建在和 Quartus II 安装目录相同的盘符下&#xff0c;否则可能导致生产 IP 失败。 3、如果…

Android Glide使用姿势与原理分析

作者&#xff1a; 午后一小憩 简介 Android Glide是一款强大的图片加载库&#xff0c;提供了丰富的功能和灵活的使用方式。本文将深入分析Glide的工作原理&#xff0c;并介绍一些使用姿势&#xff0c;助你更好地运用这个优秀的库。 原理分析 Glide的原理复杂而高效。它首先基…

Virtualenvwrapper 的安装教程

Virtualenvwrapper Virtaulenvwrapper是virtualenv的扩展包&#xff0c;用于更方便管理虚拟环境&#xff0c;它可以做&#xff1a; 将所有虚拟环境整合在一个目录下管理&#xff08;新增&#xff0c;删除&#xff0c;复制&#xff09;虚拟环境快速切换虚拟环境 安装方法 Li…

HTTP协议概述

HTTP 协议定义 HTTP协议&#xff0c;直译为超文本传输协议&#xff0c;是一种用于分布式、协作、超媒体的信息系统的应用协议。HTTP协议是万维网数据通信的基础。HTTP协议在客户端-服务器计算模型中充当请求-响应协议。客户端向服务器提交HTTP请求消息。服务器提供HTML文件和其…

SpringBoot项目在启动后自动关闭

问题描述&#xff1a; 今天搭建了一个SpringBoot项目&#xff0c;但是在启动之后就自行关闭了&#xff0c;就像下面这样&#xff1a; 原因分析&#xff1a;在创建SpringBoot项目的时候&#xff0c;Web的依赖没有导入&#xff0c;默认以普通java项目运行导致的终止。 解决方案…

CData Drivers for SAS xpt Crack

CData Drivers for SAS xpt Crack 使用基于标准的驱动程序&#xff0c;加入数据库、报告工具和自定义程序中的实时SAS xpt(XPORT)数据文件。 与BI分析、报告、ETL工具和自定义解决方案集成。 适用于SAS xpt的CData驱动程序。神奇的功能&#xff1a; BI和分析 我们的驱动程序是将…

aarch64-linux交叉编译libcurl带zlib和openssl

交叉编译libcurl需要依赖zlib和openssl 需要先用aarch64工具链编译zlib和openssl aarch64-linux环境搭建 下载工具链 gcc用于执行交叉编译 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnusysroot是交叉版本的库文件集合 sysroot-glibc-linaro-2.25-2019.12-aarch64-lin…

线性代数的学习和整理17:向量空间的基,自然基,基变换等(未完成)

目录 3 向量空间的基&#xff1a;矩阵的基础/轴 3.1 从颜色RGB说起 3.2 附属知识 3.3 什么样的向量可以做基&#xff1f; 3.4 基的分类 3.1.1 不同空间的基---向量组的数量可能不同 3.1.2 自然基 3.1.3 正交基 3.1.4 标准正交基 3.1.5 基和向量/矩阵 3.1.6 基变换 …

ClickHouse进阶(五):副本与分片-1-副本与分片

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

2023年7月京东打印机行业品牌销售排行榜(京东运营数据分析)

鲸参谋监测的京东平台7月份打印机行业销售数据已出炉&#xff01; 7月份&#xff0c;打印机市场呈现下滑趋势。根据鲸参谋平台的数据可知&#xff0c;当月京东平台打印机的销量为48万&#xff0c;环比下降约28%&#xff0c;同比下降约18%&#xff1b;销售额为4亿&#xff0c;环…

Django(10)-项目实战-对发布会管理系统进行测试并获取测试覆盖率

在发布会签到系统中使用django开发了发布会签到系统&#xff0c; 本文对该系统进行测试。 django.test django.test是Django框架中的一个模块&#xff0c;提供了用于编写和运行测试的工具和类。 django.test模块包含了一些用于测试的类和函数&#xff0c;如&#xff1a; Tes…

【数据结构】带头双向循环链表及其实现

目录 1.带头双向循环链表 2.带头双向循环链表实现 2.1初始化 2.2销毁 2.3头插 2.4链表打印 2.5头删数据 2.6尾插数据 2.7尾删数据 2.8链表判空 2.9查找一个数据 2.10在pos位置前插入数据 2.11删除pos位置 2.12求链表的长度 2.顺序表和链表的比较 1.带头双向循环…

stable diffusion实践操作-CLIP

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、CLIP是什么&#xff1f;1.1 定义&#xff1a;1.2 作用 二、使用步骤2.1 设置使用2.1 跳过层对比图&#xff1a; 三、总结 前言 学习本章之前&#xff0c;先看SD生图原理 stable diffusion实践操作-SD原理…

远程连接Ubuntu 22.04

远程连接Ubuntu 22.04 安装openssh-server sudo apt install openssh-server检查服务运行状态 systemctl status sshd重启服务状态 sudo systemctl restart ssh开启防火墙 sudo ufw enable开启ssh传输端口 sudo ufw allow ssh设置开机启动服务 sudo systemctl enable ssh配置服…

YOLOv5算法改进(12)— 替换主干网络之Swin Transformer

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。Swin Transformer是一种基于Transformer的深度学习模型&#xff0c;它在视觉任务中表现出色。与之前的Vision Transformer&#xff08;ViT&#xff09;不同&#xff0c;Swin Transformer具有高效和精确的特性&#xff0c;并…

Flink流批一体计算(20):DataStream API和Table API互转

目录 举个例子 连接器 下载连接器&#xff08;connector&#xff09;和格式&#xff08;format&#xff09;jar 包 依赖管理 如何使用连接器 举个例子 StreamExecutionEnvironment集成了DataStream API&#xff0c;通过额外的函数扩展了TableEnvironment。 下面代码演示两…

B081-Lucene+ElasticSearch

目录 认识全文检索概念lucene原理全文检索的特点常见的全文检索方案 Lucene创建索引导包分析图代码 搜索索引分析图代码 ElasticSearch认识ElasticSearchES与Kibana的安装及使用说明ES相关概念理解和简单增删改查ES查询DSL查询DSL过滤 分词器IK分词器安装测试分词器 文档映射(字…

Windows NUMA编程实践 – 处理器组、组亲和性、处理器亲和性及版本变化

Windows在设计之初没有考虑过对大数量的多CPU和NUMA架构的设备的支持&#xff0c;大部分关于CPU的设计按照64个为上限来设计。核心数越来越多的多核处理器的进入市场使得微软不得不做较大的改动来进行支持&#xff0c;因此Windows 的进程、线程和NUMA API在各个版本中行为不一样…