深入解析 StarRocks 物化視圖:全方位的查詢改寫機制

小編導讀:

本文將重點介紹如何利用物化視圖進行查詢改寫。文章將全面介紹物化視圖的基本原理、關鍵特性、應用案例、使用場景、代碼細節以及主流大數據產品的物化視圖改寫能力對比。

物化視圖在 StarRocks 中扮演著至關重要的角色,它是進行數據建模和加速查詢的神器。特別是在 BI 場景中,通過預先計算 Join 和 Aggregation 操作,物化視圖不僅能大幅度提升查詢性能,還能顯著降低存儲成本。

使用物化視圖通常包含以下三個階段:

  1. 設計與創建:首先,我們需要仔細分析查詢的特點,以選擇構建最適合的物化視圖。

  2. 視圖維護:當基礎表的數據發生變化時,物化視圖也需要及時更新,以確保數據的一致性。

  3. 查詢改寫:利用預計算的數據,物化視圖能有效地加速查詢處理過程,提供更快的響應速度。

本文重點討論物化視圖的第三階段:如何利用物化視圖進行查詢改寫。StarRocks 的異步物化視圖采用了廣泛認可的 SPJG(Select-Projection-Join-Groupby)算法。這允許系統在用戶無需修改任何查詢的前提下,自動將原始查詢轉換為對物化視圖的查詢。借助物化視圖中預計算的結果,這種自動化的查詢改寫大幅降低了計算代價,從而實現了顯著的查詢加速。

在典型的 OLAP 標準測試集中, 通過創建物化視圖可以顯著提升查詢性能:

  • SSB?100GB:與傳統的星形模型相比,物化視圖能將總體查詢耗時減少至原來的 1/3。

  • TPC-H?100GB:這種技術能加速一半的查詢,平均耗時降至原來的 1/5。

基本原理

(StarRocks 物化視圖改寫流程)

物化視圖改寫的關鍵流程如上圖所示,整體上可以劃分為以下三個階段:

  1. 預處理:在 Analyzer 處理后得到的邏輯計劃樹的基礎上,系統會識別出相關的物化視圖候選集。此階段還包括過濾掉無法用于改寫的物化視圖,以縮小搜索空間并確保物化視圖數據的新鮮度。

  2. SPJG?物化視圖改寫:應用基于cost-based的 SPJG 物化視圖改寫規則,自動遍歷搜索空間中可用于改寫的子樹,并嘗試進行改寫,并且最終會根據 Cost Model 選擇最優的改寫方案。

  3. 后處理:對物化視圖改寫后的 Plan 執行列裁剪、謂詞下推、分區裁剪等優化操作,以提升改寫后 Plan 的執行性能。

舉例說明,對于一條具體的查詢,物化視圖的改寫可以分為以下幾個步驟處理:

  1. 預處理:

  • 分析訪問表:首先分析查詢涉及的基表, 根據這些基表與物化視圖之間的依賴關系,識別可能有用的物化視圖

  • 候選視圖篩選:對于復雜的查詢可能存在大量的候選物化視圖,直接考慮所有視圖會導致計算開銷過大。因此,因此,需要根據視圖的“適用性”對候選視圖進行排序,并選擇一個子集進行進一步分析

  • 新鮮度驗證:檢查候選物化視圖的數據新鮮度,若物化視圖數據不滿足查詢的要求,則拋棄這些視圖

  1. TEXT 改寫

  • 當查詢與某個物化視圖在 AST tree/語法樹結構上完全一致時,可以通過文本匹配直接將查詢改寫為對該視圖的訪問

  1. SPJG 查詢改寫

  • SPJG 改寫適用于查詢與物化視圖有所差異的場景,可以對物化視圖進行補償改寫,提供了更大的靈活性,但實現上也更為復雜

  • 在 SQL 優化器中應用多種規則來匹配視圖和查詢,對所有可能的 Query Plan 進行改寫,這一過程的計算開銷相對較高

  • 改寫后,對于產生的所有可能的改寫結果,使用 Cost Model 來評估并選擇最優的改寫方案

  1. 后置處理

  • 對改寫后的查詢計劃應用更多優化器規則,如列裁剪、謂詞下推和分區裁剪等

select sum(lo_revenue) as lo_revenue, d_year, p_brand
from lineorder
join dates on lo_orderdate = d_datekey
join part on lo_partkey = p_partkey
join supplier on lo_suppkey = s_suppkey
where p_category = 'MFGR#12' and s_region = 'AMERICA'
group by d_year, p_brand
order by d_year, p_brand;

關鍵特性

除核心能力之外,StarRocks 物化視圖自動改寫還包括以下關鍵特性:

  1. 數據一致性:

  • 內部表一致性:確保物化視圖改寫的結果與查詢原始表結果完全一致,實現強數據一致性。

  • 過期數據處理:支持配置數據過期容忍時間,適應數據頻繁變更的場景,通過 staleness 改寫技術應對數據變化。

  1. 復雜查詢支持

  • 多表?Join?支持:支持各種類型的 join,包括 view delta join 和 join derivability rewrite 等復雜 join 場景的改寫,優化大寬表查詢。

  • 聚合查詢加速:通過聚合改寫技術加速聚合查詢,提升報表查詢性能。

  • 嵌套視圖改寫:支持嵌套物化視圖改寫,解決復雜查詢的改寫問題,擴展改寫范圍。

  • 復雜表達式支持:夠處理包括函數調用和四則運算在內的復雜表達式,滿足復雜的分析計算需求

  1. 實時數據融合

  • 新鮮數據查詢加速:利用 union 改寫和 TTL 功能聯合使用,加速新鮮數據查詢,并實現歷史數據自動回查原表。

  1. 多數據源支持

  • 邏輯視圖物化:允許在邏輯視圖上創建物化視圖,支持基于 view 建模的場景下的查詢加速

  • 外部表物化視圖:支持包括 Hive、Iceberg、Hudi、DeltaLake、Paimon、JDBC(MySQL Dialet)等,提升數據湖場景下的查詢性能

應用案例

在攜程的 BI 平臺中,通過 StarRocks MV 實現了幾方面的性能加速:

  • Projection MV:在 Hive Table 基礎上創建 Projection MV,發揮 StarRocks 內表和存儲引擎的性能,使得關鍵報表能夠獲得幾倍的性能加速。由于 StarRocks MV 能夠支持 Hive Table 的自動刷新,一次創建后幾乎不需要后續的維護,從而大幅降低 ETL 的維護成本

  • 嵌套視圖:在 MV 的基礎上,對復雜查詢創建嵌套視圖,以進一步加速關鍵報表查詢。這些查詢通常涉及 BI 場景中的典型操作,如 Join、Aggregation、多層聚合等復雜查詢。

  • AutoMV:利用 AutoMV 能力,分析慢查詢自動推薦出合適的物化視圖,從而進一步減少了人工維護成本。

使用場景

Join Rewrite

StarRocks 支持 join 查詢改寫,支持的 join 類型包括:Inner join/cross join/left outer join/full outer join/right outer join/semi join/anti join。

下面是一個 join mv 改寫的例子,建表如下:

CREATE?TABLE?`customer`?(`c_custkey`?int(11)?NOT?NULL?COMMENT?"",`c_name`?varchar(26)?NOT?NULL?COMMENT?"",`c_address`?varchar(41)?NOT?NULL?COMMENT?"",`c_city`?varchar(11)?NOT?NULL?COMMENT?"",`c_nation`?varchar(16)?NOT?NULL?COMMENT?"",`c_region`?varchar(13)?NOT?NULL?COMMENT?"",`c_phone`?varchar(16)?NOT?NULL?COMMENT?"",`c_mktsegment`?varchar(11)?NOT?NULL?COMMENT?""
)?ENGINE=OLAP
DUPLICATE?KEY(`c_custkey`)
COMMENT?"OLAP"
DISTRIBUTED?BY?HASH(`c_custkey`)?BUCKETS?12
PROPERTIES?(
"replication_num"?=?"1"
);CREATE?TABLE?`lineorder`?(`lo_orderkey`?int(11)?NOT?NULL?COMMENT?"",`lo_linenumber`?int(11)?NOT?NULL?COMMENT?"",`lo_custkey`?int(11)?NOT?NULL?COMMENT?"",`lo_partkey`?int(11)?NOT?NULL?COMMENT?"",`lo_suppkey`?int(11)?NOT?NULL?COMMENT?"",`lo_orderdate`?int(11)?NOT?NULL?COMMENT?"",`lo_orderpriority`?varchar(16)?NOT?NULL?COMMENT?"",`lo_shippriority`?int(11)?NOT?NULL?COMMENT?"",`lo_quantity`?int(11)?NOT?NULL?COMMENT?"",`lo_extendedprice`?int(11)?NOT?NULL?COMMENT?"",`lo_ordtotalprice`?int(11)?NOT?NULL?COMMENT?"",`lo_discount`?int(11)?NOT?NULL?COMMENT?"",`lo_revenue`?int(11)?NOT?NULL?COMMENT?"",`lo_supplycost`?int(11)?NOT?NULL?COMMENT?"",`lo_tax`?int(11)?NOT?NULL?COMMENT?"",`lo_commitdate`?int(11)?NOT?NULL?COMMENT?"",`lo_shipmode`?varchar(11)?NOT?NULL?COMMENT?""
)?ENGINE=OLAP
DUPLICATE?KEY(`lo_orderkey`)
COMMENT?"OLAP"
DISTRIBUTED?BY?HASH(`lo_orderkey`)?BUCKETS?48
PROPERTIES?(
"replication_num"?=?"1"
);

基于上述的表,構建物化視圖

-- MV
create materialized view join_mv1
distributed by hash(`lo_orderkey`)
as
select lo_orderkey, lo_linenumber, lo_revenue, lo_partkey, c_name, c_address
from lineorder inner join customer
on lo_custkey = c_custkey;

則如下的查詢可以被改寫為查詢join_mv1:

--?Query
select?lo_orderkey,?lo_linenumber,?lo_revenue,?c_name,?c_address
from?lineorder?inner?join?customer
on?lo_custkey?=?c_custkey;

在 join 中,select 中支持復雜表達式改寫,比如四則運算,string 函數,日期函數處理,case when 表達式,or 謂詞等等。

select?lo_orderkey,?lo_linenumber,?(2?*?lo_revenue?+?1)?*?lo_linenumber,?upper(c_name),?substr(c_address,?3)
from?lineorder?inner?join?customer
on?lo_custkey?=?c_custkey;

上述的 join 改寫場景是 Query 的 join 類型和表集合同 MV 相同的場景,StarRocks 中還擴展支持了以下幾種 join 場景的改寫。

1.1 Query delta join rewrite

query delta join 就是指查詢的 join 表是物化視圖中 join 表的超集場景。比如如下 query 是 lineorder/customer/part三表 join,join_mv1 只有 lineorder/customer 兩表 join,StarRocks 支持將 query 改寫到 join_mv1。

select?lo_orderkey,?lo_linenumber,?lo_revenue,?c_name,?c_address,?p_name
fromlineorder?inner?join?customer?on?lo_custkey?=?c_custkeyinner?join?part?on?lo_partkey?=?p_partkey?

改寫之后的 plan 如下:

1.2 View delta join rewrite

View delta join 指的是在查詢中,涉及的 join 表是物化視圖中 join 表的子集。這種場景的改寫能力通常適用于大寬表查詢。例如,在 SSB 場景中,可以構建一個包含所有表的物化視圖,將多個表 join 成一個大寬表。這樣,所有 SSB 查詢都可以通過物化視圖的透明改寫來提升查詢性能。測試結果表明,通過物化視圖改寫后的多表 join 查詢,其性能可達到直接查詢大寬表的水平。

為了實現 view delta join 的改寫,要求物化視圖中的 join 必須與查詢中的 join 具有1:1的 cardinality preservation(基數保持)關系。以下是 SSB 改寫的示例。在滿足下列的 join 條件時,都可以進行 cardinality preservation join 改寫。任何滿足其中一種條件的 join,都能夠進行 view delta join 的改寫。

在 StarRocks 中, 可以用以下語法指定主外鍵關系:

CREATE?TABLE?`customer`?(...)?
PROPERTIES?("unique_constraints"?=?"c_custkey"?#指定唯一鍵
);CREATE?TABLE?`lineorder`?(...)?
PROPERTIES?("foreign_key_constraints"?=?"(lo_custkey)?REFERENCES?customer(c_custkey);(lo_partkey)?REFERENCES?part(p_partkey);(lo_suppkey)?REFERENCES?supplier(s_suppkey)"?#指定外鍵約束
);

對于 SSB 中的 Query,往往不會查詢 MV 的所有表,但是通過指定了主外鍵關系,仍然能夠利用物化視圖改寫加速,以其中一個查詢為例:

--MV
CREATE?MATERIALIZED?VIEW?lineorder_flat_mv
DISTRIBUTED?BY?HASH(LO_ORDERDATE,?LO_ORDERKEY)?BUCKETS?48
partition?by?LO_ORDERDATE
REFRESH?manual
PROPERTIES?("replication_num"?=?"1"
)
AS?SELECT*FROM?lineorder?AS?lINNER?JOIN?customer?AS?c?ON?c.C_CUSTKEY?=?l.LO_CUSTKEYINNER?JOIN?supplier?AS?s?ON?s.S_SUPPKEY?=?l.LO_SUPPKEYINNER?JOIN?part?AS?p?ON?p.P_PARTKEY?=?l.LO_PARTKEYINNER?JOIN?dates?AS?d?ON?l.LO_ORDERDATE?=?d.D_DATEKEY;????
--?Query
select?sum(lo_revenue)?as?lo_revenue,?d_year,?p_brand
from?lineorder
join?dates?on?lo_orderdate?=?d_datekey
join?part?on?lo_partkey?=?p_partkey
join?supplier?on?lo_suppkey?=?s_suppkey
where?p_category?=?'MFGR#12'?and?s_region?=?'AMERICA'
group?by?d_year,?p_brand
order?by?d_year,?p_brand;

1.3 Join derivability rewrite

Join 派生改寫是在物化視圖(MV)的 JOIN 類型與查詢(query)不一致,但 MV 的結果包含查詢的結果時,進行的改寫,例如 MV 使用了 OUTER JOIN,而查詢是 INNER JOIN。目前分為以下兩種情況:

  1. 兩表?join?的情況:此時會枚舉所有 JOIN 順序和多種 JOIN 方式,檢查 INNER/SEMI/ANTI/OUTER 之間是否兼容,在兼容的情況下仍然能夠進行改寫

  2. 三表或三表以上的?join:多表時無法枚舉所有可能性,因此只做相對嚴格的兼容性檢查

舉個例子,MV 使用了 OUTER JOIN,而 Query 是 INNER JOIN, 直接改寫會導致結果中包含 NULL,此時 StarRocks 會補償一個謂詞?IS NOT NULL?去保證結果的正確性。

--?MV
create?materialized?view?join_mv3?
distributed?by?hash(`lo_orderkey`)
as
select?lo_orderkey,?lo_linenumber,?c_name,?sum(lo_revenue)?as?total_revenue,?max(lo_discount)?as?max_discount?
from?lineorder?
left?join?customer
on?lo_custkey?=?c_custkey
group?by?lo_orderkey,?lo_linenumber,?c_name;--?Query
select?lo_orderkey,?lo_linenumber,?c_name,?sum(lo_revenue)?as?total_revenue,?max(lo_discount)?as?max_discount?
from?lineorder?
join?customer
on?lo_custkey?=?c_custkey
group?by?lo_orderkey,?lo_linenumber,?c_name;

Aggregation Rewrite

支持多表聚合查詢的改寫,并且支持所有的聚合函數,其中包括 bitmap_union/hll_union/percentile_union 等。

--?MV
create?materialized?view?agg_mv1
distributed?by?hash(`lo_orderkey`)
as
select?lo_orderkey,?lo_linenumber,?c_name,?sum(lo_revenue)?as?total_revenue,?max(lo_discount)?as?max_discount?
from?lineorder?inner?join?customer
on?lo_custkey?=?c_custkey
group?by?lo_orderkey,?lo_linenumber,?c_name;

如下查詢可被 agg_mv1 改寫

--?Query
select?lo_orderkey,?lo_linenumber,?c_name,?sum(lo_revenue)?as?total_revenue,?max(lo_discount)?as?max_discount?
from?lineorder?inner?join?customer
on?lo_custkey?=?c_custkey
group?by?lo_orderkey,?lo_linenumber,?c_name;

除此最基礎的場景之外, 還有一些擴展的場景。

2.1 Rollup

同時,支持聚合物化視圖的上卷改寫,例如當查詢中的 GROUP BY 比 MV 的 GROUP BY 更少時,能夠一定程度上服用 MV 的結果,但是仍然需要做二次聚合,才能得到最終結果:

2.2 Count distinct

Count distinct 計算一般應用于精確去重的場景。與普通的聚合不同在于,它通常無法利用上卷進行改寫。

但是 StarRocks 支持通過 bitmap 來實現 count distinct 改寫,進而實現基于物化視圖的高性能精確去重:

  • 創建物化視圖時,使用?bitmap_union(to_bitmap(lo_custkey))

  • 查詢時,仍然使用普通的?count(distinct lo_custkey)?即可

--?MV
create?materialized?view?distinct_mv
distributed?by?hash(`lo_orderkey`)
as
select?lo_orderkey,?bitmap_union(to_bitmap(lo_custkey))?as?distinct_customer
from?lineorder
group?by?lo_orderkey;--?Query
select?lo_orderkey,?count(distinct?lo_custkey)?from?lineorder?group?by?lo_orderkey;

Nested mv rewrite

StarRocks 支持嵌套物化視圖改寫。比如有如下三個物化視圖,agg_mv2 是基于物化視圖 join_mv2 之上構建的物化視圖;agg_mv3 是基于 agg_mv2 之上構建的物化視圖。通過這種方式,能夠有效處理復雜的多層子查詢。

Union rewrite

Union Rewrite 指的是物化視圖的數據是查詢的子集,仍然能夠進行改寫:

  • Partial Predicate:MV 謂詞范圍是查詢的子集,此時會將差集回原表查詢,再 UNION 起來

  • Partial Partition:MV 只物化了部分 Partition,此時其余的 Partition 回原表查詢

4.1 Partial predicate

例如 MV 中有謂詞?where lo_orderkey < 300000000

--?MV
create?materialized?view?agg_mv4
distributed?by?hash(`lo_orderkey`)
as
select?lo_orderkey,?sum(lo_revenue)?as?total_revenue,?max(lo_discount)?as?max_discount?
from?lineorder
where?lo_orderkey?<?300000000
group?by?lo_orderkey;

則如下的查詢會被改寫:其中,agg_mv5 包含?lo_orderkey < 300000000?的數據,lo_orderkey >= 300000000?的數據通過直接讀取lineorder表進行計算,最終通過union之后再聚合,獲取最終結果。

--?Query
select?lo_orderkey,?sum(lo_revenue)?as?total_revenue,?max(lo_discount)?as?max_discount?
from?lineorder
group?by?lo_orderkey;

4.2 Partial partition

針對分區表來說,如果基于分區表構建分區物化視圖,查詢的分區范圍是物化視圖的最新分區范圍的超集,查詢會被 union 改寫。

比如,有如下的物化視圖, base 表?lineorder?的目前包含 p1-p7 分區,物化視圖目前也包括 p1-p7 分區。

--?MV
create?materialized?view?agg_mv5
distributed?by?hash(`lo_orderkey`)
partition?by?range(`lo_orderdate`)
refresh?manual
as
select?lo_orderdate,?lo_orderkey,?sum(lo_revenue)?as?total_revenue,?max(lo_discount)?as?max_discount?
from?lineorder
group?by?lo_orderkey;

如果?lineorder?新增一個 p8 分區,分區范圍是[("19990101"), ("20000101")),則下面的查詢會被改寫為 union:

--?Query
select?lo_orderdate,?lo_orderkey,?sum(lo_revenue)?as?total_revenue,?max(lo_discount)?as?max_discount?
from?lineorder
group?by?lo_orderkey;

其中,agg_mv5 包含 p1-p7 分區的數據,p8 分區的數據通過直接讀取 lineorder 表進行計算,最終通過 union 之后再聚合,獲取最終結果。

MV on views

支持從 view 上創建 MV,并且查詢 view 的時候能夠實現透明改寫。在查詢改寫時會有兩種方式:

  • VIEW 展開:內聯整個 VIEW,當做普通的 QUERY 改寫

  • VIEW 獨立:將 VIEW 作為獨立的算子,不考慮內容,再進行改寫

比如有如下的 view

--?View
create?view?customer_view1?as
select?c_custkey,?c_name,?c_address
from?customer;--?View
create?view?lineorder_view1?as
select?lo_orderkey,?lo_linenumber,?lo_custkey,?lo_revenue
from?lineorder;

則可以構建如下的物化視圖,在改寫的時候,MV 上的 view 會被自動展開到 view 引用的 base 表上,然后進行透明匹配改寫。

--?MV
create?materialized?view?join_mv1
distributed?by?hash(`lo_orderkey`)
as
select?lo_orderkey,?lo_linenumber,?lo_revenue,?c_name
from?lineorder_view1?inner?join?customer_view1
on?lo_custkey?=?c_custkey;

MV on External catalog

StarRocks 支持在 Hive/Hudi/Iceberg/Paimon/DeltaLake/JDBC 外表上構建物化視圖,并且能夠進行透明改寫。上述所有的改寫能力大部分在外表物化視圖中都支持,具體支持程度可參考使用文檔。

StarRocks 在物化視圖改寫上,目前還有如下限制:

  1. 不支持非確定性函數的改寫,包括RAND/RANDOM/UUID/SLEEP等

  2. 在SPJG改寫模式下,不支持窗口分析函數的改寫;基于文本的改寫,不受這個限制

  3. 在SPJG改寫模式下,如果mv定義語句中包含limit/order by/union/except/intersect/minus/grouping sets/with cube/with rollup,則無法用于改寫;基于文本的改寫,不受這個限制

  4. 部分外表(Hudi/DeltaLake)上還不支持查詢結果的強一致

能力對比

以下列出主流大數據產品在物化視圖上的改寫能力:

圖片

總結

本文主要介紹了 StarRocks 中物化視圖查詢改寫的技術原理,從優化器的執行流程,到對不同查詢的處理 Join、Aggregation、View、Union 等,以及內部視角的反省和外部視角的對比。希望本文能夠對關心技術原理的讀者有所幫助,對 StarRocks 的用戶帶來更多的技術洞察和業務啟發

參考文獻:

  1. Optimizing Queries Using Materialized Views: A Practical, Scalable Solution

  2. Materialized view in Apache calcite:?https://calcite.apache.org/docs/materialized_views.html

  3. Oracle:https://docs.oracle.com/en/database/oracle/oracle-database/12.2/dwhsg/advanced-query-rewrite-materialized-views.html#GUID-0906CA6B-7EE3-42E1-A598-C6541BCD9B36

延伸閱讀:

StarRocks 物化視圖:指標平臺性能提升的新引擎

重新定義物化視圖,你必須擁有的極速湖倉神器!

QPS 提升 10 倍!滴滴借助 StarRocks 物化視圖實現低成本精確去重

StarRocks 技術內幕 | 多表物化視圖的設計與實現

更多交流,聯系我們:StarRocks

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63522.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2. petalinux-build失敗

NOTE 解決因為網絡原因產生的編譯錯誤分享詳細的解決步驟 報錯的情況 因為網絡原因產生編譯錯誤 現象 找不到適合的包文件(No suitable stageing package found) 不能發現文件(Fetcher failure for URL) 解決方法 采用本地加載本地文件的方式&#xff0c;步驟如下 進入…

sql server msdb數據庫備份恢復

備份 BACKUP DATABASE [msdb] TO DISK ND:\liyuanshuai\test\sqlserver_bakfile\msdb20241219.bak WITH NOFORMAT, NOINIT, NAME Nlys-完整 數據庫 備份, SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS 10 GO然后刪除2個測試的job&#xff0c;停止 SQL Server 代理…

web實驗二

web實驗二 2024.12.19 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>青島理工大學</title>&l…

bain.js(十二):RNN神經網絡實戰教程 - 音樂樂譜生成 -人人都是作曲家~

系列文章&#xff1a; &#xff08;一&#xff09;&#xff1a;可以在瀏覽器運行的、默認GPU加速的神經網絡庫概要介紹&#xff08;二&#xff09;&#xff1a;項目集成方式詳解&#xff08;三&#xff09;&#xff1a;手把手教你配置和訓練神經網絡&#xff08;四&#xff09…

WebSocket入門與結合redis

WebSocket是什么 WebSocket 是一種用于在客戶端和服務器之間建立雙向通信的協議&#xff0c;它能實現實時、持久的連接。與傳統的 HTTP 請求響應模式不同&#xff0c;WebSocket 在建立連接后允許客戶端和服務器之間相互發送消息&#xff0c;直到連接關閉。由于 WebSocket 具有…

Hive是什么,Hive介紹

官方網站&#xff1a;Apache Hive Hive是一個基于Hadoop的數據倉庫工具&#xff0c;主要用于處理和查詢存儲在HDSF上的大規模數據?。Hive通過將結構化的數據文件映射為數據庫表&#xff0c;并提供類SQL的查詢功能&#xff0c;使得用戶可以使用SQL語句來執行復雜的?MapReduce任…

OpenHarmony和OpenVela的技術創新以及兩者對比

兩款有名的國內開源操作系統&#xff0c;OpenHarmony&#xff0c;OpenVela都非常的優秀。本文對二者的創新進行一個簡要的介紹和對比。 一、OpenHarmony OpenHarmony具有諸多有特點的技術突破和重要貢獻&#xff0c;以下是一些主要方面&#xff1a; 架構設計創新 分層架構…

Electron-Vue 開發下 dev/prod/webpack server各種路徑設置匯總

背景 在實際開發中&#xff0c;我發現團隊對于這幾個路徑的設置上是純靠猜的&#xff0c;通過一點點地嘗試來找到可行的路徑&#xff0c;這是不應該的&#xff0c;我們應該很清晰地了解這幾個概念&#xff0c;以下通過截圖和代碼進行細節講解。 npm run dev 下的路徑如何處理&…

前端-處理數據的函數

判斷數據是否為空,對象是否存在某屬性,屬性值是否為空,對大數據進行換算,對單位進行轉換. 目錄 1.格式化數據 2.判斷值是否為空(包括對象、數組、字符串、數值類型) &#xff08;1&#xff09;值是0不表示空 &#xff08;2&#xff09;值是0表示空 3. 檢查對象是否具有指定名…

基礎入門-Web應用蜜罐系統堡壘機運維API內外接口第三方拓展架構部署影響

知識點&#xff1a; 1、基礎入門-Web應用-蜜罐系統 2、基礎入門-Web應用-堡壘機運維 3、基礎入門-Web應用-內外API接口 4、基礎入門-Web應用-第三方拓展架構 一、演示案例-Web-拓展應用-蜜罐-釣魚誘使 蜜罐&#xff1a;https://hfish.net/ 測試系統&#xff1a;Ubuntu 20.04 …

Android運行低版本項目可能遇到的問題

Android運行低版本項目可能遇到的問題 低版本項目總是遇到各種問題的&#xff0c;耐心點 一、gradle-xxx.xxx.xxx.zip一直下載不下來 在gradle-wrapper.properties可以試下 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME …

springboot中Controller內文件上傳到本地以及阿里云

上傳文件的基本操作 <form action"/upload" method"post" enctype"multipart/form-data"> <h1>登錄</h1> 姓名&#xff1a;<input type"text" name"username" required><br> 年齡&#xf…

智慧城市工程:相關學點、優勢、未來發展

目錄 相關學點&#xff1a; 智慧城市的優勢 挑戰與未來發展 智慧城市工程是利用現代信息技術和數據分析手段&#xff0c;提升城市管理和服務水平&#xff0c;實現城市運行的智能化、便捷化和高效化的一種新型城市發展模式。智慧城市通過整合物聯網&#xff08;IoT&#xff0…

授權模型MAC

MAC&#xff08;Mandatory Access Control&#xff09;是一種授權模型&#xff0c;用于實現對系統資源訪問的強制控制。在MAC模型中&#xff0c;授權是基于預先定義的安全策略&#xff0c;且該策略由系統管理員來配置和管理。 在MAC模型中&#xff0c;每個用戶和每個資源都被賦…

看板工具助力餐飲與酒店行業實現數字化轉型,提升管理與運營效率

在餐飲與酒店行業&#xff0c;服務質量和客戶體驗是衡量企業成功的關鍵因素。隨著客戶需求的不斷多樣化以及市場競爭的加劇&#xff0c;傳統的管理模式逐漸難以滿足高效運營的需求。尤其在高峰期&#xff0c;如何優化內部流程、提高服務效率和響應速度&#xff0c;成為了許多餐…

2024年CCF 非專業級軟件能力認證CSP-J/S 第二輪( 提高組) 染色(color)

完整題目內容可前往下方鏈接&#xff1a; 染色&#xff08;color&#xff09;_C_嗨信奧-玩嗨信息奧林匹克競賽-少兒編程題庫學習中心https://www.hixinao.com/tiku/cpp/show-4118.html 若需更多真題&#xff0c;可前往題庫中心查找&#xff0c;題庫中心涵蓋白名單賽事真題&am…

OpenIPC開源FPV之Adaptive-Link天空端代碼解析

OpenIPC開源FPV之Adaptive-Link天空端代碼解析 1. 源由2. 框架代碼2.1 消息機制2.2 超時機制 3. 報文處理3.1 special報文3.2 普通報文 4. 工作流程4.1 Profile 競選4.2 Profile 研判4.2.1 回退策略4.2.2 保持策略 4.3 Profile 應用 5. 總結6. 參考資料7. 補充資料7.1 RSSI 和 …

labelme標簽批量轉換數據集json_to_dataset

文章目錄 labelme標簽批量轉換數據集json_to_dataset轉換原理單張圖片轉換多張圖片批量轉換bat腳本循環法 標注圖片提取標注圖片轉單通道 labelme標簽批量轉換數據集json_to_dataset 轉自labelme批量制作數據集教程。 轉換原理 在安裝了labelme的虛擬環境中有一個labelme_js…

Apache Kylin最簡單的解析、了解

官網&#xff1a;Overview | Apache Kylin 一、Apache Kylin是什么&#xff1f; 由中國團隊研發具有濃厚的中國韻味&#xff0c;使用神獸麒麟&#xff08;kylin&#xff09;為名 的一個OLAP多維數據分析引擎:&#xff08;據官方給出的數據&#xff09; 亞秒級響應&#xff…

01云計算HCIA學習筆記

筆者今年7月底考取了華為云計算方向的HCIE認證&#xff0c;回顧從IA到IE的學習和項目實戰&#xff0c;想整合和分享自己的學習歷程&#xff0c;歡迎志同道合的朋友們一起討論&#xff01; 第一章 云計算概述 ICT&#xff1a;ICT是世界電信協會在2001年的全球會議中提出的一個綜…