TDengine SQL查詢語法

簡介

TDengine 中的查詢 SQL 基本遵循 MYSQL 的查詢語法,大部分查詢都是通過超級表按時間維度進行的各種查詢。

TDengine 時序數據庫以時間為主索引列進行數據組織排序及存儲,同時按存儲塊做了預計算,所以在無普通列過濾的 SQL 查詢語句中聚合函數查詢會使用到預計算,如 sum count min max 等函數,查詢速度會非常快。

關于 TDengine 中的索引,不支持普通列創建索引,支持標簽列創建索引,第一個標簽列默認帶索引,無需創建。

查詢語法

SELECT {DATABASE() | CLIENT_VERSION() | SERVER_VERSION() | SERVER_STATUS() | NOW() | TODAY() | TIMEZONE() | CURRENT_USER() | USER() }SELECT [hints] [DISTINCT] [TAGS] select_listfrom_clause[WHERE condition][partition_by_clause][interp_clause][window_clause][group_by_clause][order_by_clasue][SLIMIT limit_val [SOFFSET offset_val]][LIMIT limit_val [OFFSET offset_val]][>> export_file]hints: /*+ [hint([hint_param_list])] [hint([hint_param_list])] */hint:BATCH_SCAN | NO_BATCH_SCAN | SORT_FOR_GROUP | PARTITION_FIRST | PARA_TABLES_SORT | SMALLDATA_TS_SORTselect_list:select_expr [, select_expr] ...select_expr: {*| query_name.*| [schema_name.] {table_name | view_name} .*| t_alias.*| expr [[AS] c_alias]
}from_clause: {table_reference [, table_reference] ...| table_reference join_clause [, join_clause] ...
}table_reference:table_expr t_aliastable_expr: {table_name| view_name| ( subquery )
}join_clause:[INNER|LEFT|RIGHT|FULL] [OUTER|SEMI|ANTI|ASOF|WINDOW] JOIN table_reference [ON condition] [WINDOW_OFFSET(start_offset, end_offset)] [JLIMIT jlimit_num]window_clause: {SESSION(ts_col, tol_val)| STATE_WINDOW(col)| INTERVAL(interval_val [, interval_offset]) [SLIDING (sliding_val)] [WATERMARK(watermark_val)] [FILL(fill_mod_and_val)]| EVENT_WINDOW START WITH start_trigger_condition END WITH end_trigger_condition| COUNT_WINDOW(count_val[, sliding_val])interp_clause:RANGE(ts_val [, ts_val]) EVERY(every_val) FILL(fill_mod_and_val)| RANGE(ts_val, surrounding_time_val) FILL(fill_mod_and_val)partition_by_clause:PARTITION BY partition_by_expr [, partition_by_expr] ...partition_by_expr:{expr | position | c_alias}group_by_clause:GROUP BY group_by_expr [, group_by_expr] ... HAVING conditiongroup_by_expr:{expr | position | c_alias}order_by_clasue:ORDER BY order_expr [, order_expr] ...order_expr:{expr | position | c_alias} [DESC | ASC] [NULLS FIRST | NULLS LAST]

Hints

Hints 是用戶控制單個語句查詢優化的一種手段,當 Hint 不適用于當前的查詢語句時會被自動忽略,具體說明如下:

  • Hints 語法以/*+開始,終于*/,前后可有空格。
  • Hints 語法只能跟隨在 SELECT 關鍵字后。
  • 每個 Hints 可以包含多個 Hint,Hint 間以空格分開,當多個 Hint 沖突或相同時以先出現的為準。
  • 當 Hints 中某個 Hint 出現錯誤時,錯誤出現之前的有效 Hint 仍然有效,當前及之后的 Hint 被忽略。
  • hint_param_list 是每個 Hint 的參數,根據每個 Hint 的不同而不同。

目前支持的 Hints 列表如下:

Hint參數說明適用范圍
BATCH_SCAN采用批量讀表的方式超級表 JOIN 語句
NO_BATCH_SCAN采用順序讀表的方式超級表 JOIN 語句
SORT_FOR_GROUP采用 sort 方式進行分組,與 PARTITION_FIRST 沖突partition by 列表有普通列時
PARTITION_FIRST在聚合之前使用 PARTITION 計算分組,與 SORT_FOR_GROUP 沖突partition by 列表有普通列時
PARA_TABLES_SORT超級表的數據按時間戳排序時,不使用臨時磁盤空間,只使用內存。當子表數量多,行長比較大時候,會使用大量內存,可能發生 OOM超級表的數據按時間戳排序時
SMALLDATA_TS_SORT超級表的數據按時間戳排序時,查詢列長度大于等于 256,但是行數不多,使用這個提示,可以提高性能超級表的數據按時間戳排序時
SKIP_TSMA用于顯示的禁用 TSMA 查詢優化帶 Agg 函數的查詢語句

舉例:

SELECT /*+ BATCH_SCAN() */ a.ts FROM stable1 a, stable2 b where a.tag0 = b.tag0 and a.ts = b.ts;
SELECT /*+ SORT_FOR_GROUP() */ count(*), c1 FROM stable1 PARTITION BY c1;
SELECT /*+ PARTITION_FIRST() */ count(*), c1 FROM stable1 PARTITION BY c1;
SELECT /*+ PARA_TABLES_SORT() */ * from stable1 order by ts;
SELECT /*+ SMALLDATA_TS_SORT() */ * from stable1 order by ts;

列表

查詢語句可以指定部分或全部列作為返回結果。數據列和標簽列都可以出現在列表中。

通配符

通配符 * 可以用于代指全部列。對于普通表和子表,結果中只有普通列。對于超級表,還包含了 TAG 列。

SELECT * FROM d1001;

通配符支持表名前綴,以下兩個 SQL 語句均為返回全部的列:

SELECT * FROM d1001;
SELECT d1001.* FROM d1001;

在 JOIN 查詢中,帶表名前綴的*和不帶前綴*返回的結果有差別, *返回全部表的所有列數據(不包含標簽),而帶表名前綴的通配符,則只返回該表的列數據。

SELECT * FROM d1001, d1003 WHERE d1001.ts=d1003.ts;
SELECT d1001.* FROM d1001,d1003 WHERE d1001.ts = d1003.ts;

上面的查詢語句中,前者返回 d1001 和 d1003 的全部列,而后者僅返回 d1001 的全部列。

在使用 SQL 函數來進行查詢的過程中,部分 SQL 函數支持通配符操作。其中的區別在于:
count(*)函數只返回一列。firstlastlast_row函數則是返回全部列。

標簽列

在超級表和子表的查詢中可以指定 標簽列,且標簽列的值會與普通列的數據一起返回。

SELECT location, groupid, current FROM d1001 LIMIT 2;

別名

別名的命名規則與列相同,支持直接指定 UTF-8 編碼格式的中文別名。

結果去重

DISTINCT 關鍵字可以對結果集中的一列或多列進行去重,去除的列既可以是標簽列也可以是數據列。

對標簽列去重:

SELECT DISTINCT tag_name [, tag_name ...] FROM stb_name;

對數據列去重:

SELECT DISTINCT col_name [, col_name ...] FROM tb_name;

:::info

  1. cfg 文件中的配置參數 maxNumOfDistinctRes 將對 DISTINCT 能夠輸出的數據行數進行限制。其最小值是 100000,最大值是 100000000,默認值是 10000000。如果實際計算結果超出了這個限制,那么會僅輸出這個數量范圍內的部分。
  2. 由于浮點數天然的精度機制原因,在特定情況下,對 FLOAT 和 DOUBLE 列使用 DISTINCT 并不能保證輸出值的完全唯一性。

:::

標簽查詢

當查詢的列只有標簽列時,TAGS 關鍵字可以指定返回所有子表的標簽列。每個子表只返回一行標簽列。

返回所有子表的標簽列:

SELECT TAGS tag_name [, tag_name ...] FROM stb_name

結果集列名

SELECT子句中,如果不指定返回結果集合的列名,結果集列名稱默認使用SELECT子句中的表達式名稱作為列名稱。此外,用戶可使用AS來重命名返回結果集合中列的名稱。例如:

taos> SELECT ts, ts AS primary_key_ts FROM d1001;

但是針對first(*)last(*)last_row(*)不支持針對單列的重命名。

偽列

偽列: 偽列的行為表現與普通數據列相似但其并不實際存儲在表中。可以查詢偽列,但不能對其做插入、更新和刪除的操作。偽列有點像沒有參數的函數。下面介紹是可用的偽列:

TBNAME
TBNAME 可以視為超級表中一個特殊的標簽,代表子表的表名。

獲取一個超級表所有的子表名及相關的標簽信息:

SELECT TAGS TBNAME, location FROM meters;

建議用戶使用 INFORMATION_SCHEMA 下的 INS_TAGS 系統表來查詢超級表的子表標簽信息,例如獲取超級表 meters 所有的子表名和標簽值:

SELECT table_name, tag_name, tag_type, tag_value FROM information_schema.ins_tags WHERE stable_name='meters';

統計超級表下轄子表數量:

SELECT COUNT(*) FROM (SELECT DISTINCT TBNAME FROM meters);

以上兩個查詢均只支持在 WHERE 條件子句中添加針對標簽(TAGS)的過濾條件。

_QSTART/_QEND

_qstart 和_qend 表示用戶輸入的查詢時間范圍,即 WHERE 子句中主鍵時間戳條件所限定的時間范圍。如果 WHERE 子句中沒有有效的主鍵時間戳條件,則時間范圍為[-2^63, 2^63-1]。

_qstart 和_qend 不能用于 WHERE 子句中。

_WSTART/_WEND/_WDURATION
_wstart 偽列、_wend 偽列和_wduration 偽列
_wstart 表示窗口起始時間戳,_wend 表示窗口結束時間戳,_wduration 表示窗口持續時長。

這三個偽列只能用于時間窗口的窗口切分查詢之中,且要在窗口切分子句之后出現。

_c0/_ROWTS

TDengine 中,所有表的第一列都必須是時間戳類型,且為其主鍵,_rowts 偽列和_c0 偽列均代表了此列的值。相比實際的主鍵時間戳列,使用偽列更加靈活,語義也更加標準。例如,可以和 max\min 等函數一起使用。

select _rowts, max(current) from meters;

_IROWTS

_irowts 偽列只能與 interp 函數一起使用,用于返回 interp 函數插值結果對應的時間戳列。

select _irowts, interp(current) from meters range('2020-01-01 10:00:00', '2020-01-01 10:30:00') every(1s) fill(linear);

_IROWTS_ORIGIN
_irowts_origin 偽列只能與 interp 函數一起使用,不支持在流計算中使用, 僅適用于FILL類型為PREV/NEXT/NEAR, 用于返回 interp 函數所使用的原始數據的時間戳列。若范圍內無值, 則返回 NULL。

select _iorwts_origin, interp(current) from meters range('2020-01-01 10:00:00', '2020-01-01 10:30:00') every(1s) fill(NEXT);

查詢對象

FROM 關鍵字后面可以是若干個表(超級表)列表,也可以是子查詢的結果。
如果沒有指定用戶的當前數據庫,可以在表名稱之前使用數據庫的名稱來指定表所屬的數據庫。例如:power.d1001 方式來跨庫使用表。

TDengine 支持基于時間戳主鍵的 INNER JOIN,規則如下:

  1. 支持 FROM 表列表和顯式的 JOIN 子句兩種語法。
  2. 對于普通表和子表,ON 條件必須有且只有時間戳主鍵的等值條件。
  3. 對于超級表,ON 條件在時間戳主鍵的等值條件之外,還要求有可以一一對應的標簽列等值條件,不支持 OR 條件。
  4. 參與 JOIN 計算的表只能是同一種類型,即只能都是超級表,或都是子表,或都是普通表。
  5. JOIN 兩側均支持子查詢。
  6. 不支持與 FILL 子句混合使用。

GROUP BY

如果在語句中同時指定了 GROUP BY 子句,那么 SELECT 列表只能包含如下表達式:

  1. 常量
  2. 聚集函數
  3. 與 GROUP BY 后表達式相同的表達式。
  4. 包含前面表達式的表達式

GROUP BY 子句對每行數據按 GROUP BY 后的表達式的值進行分組,并為每個組返回一行匯總信息。

GROUP BY 子句中可以通過指定表或視圖的列名來按照表或視圖中的任何列分組,這些列不需要出現在 SELECT 列表中。

GROUP BY 子句中可以使用位置語法,位置標識為正整數,從 1 開始,表示使用 SELECT 列表的第幾個表達式進行分組。

GROUP BY 子句中可以使用結果集列名,表示使用 SELECT 列表的指定表達式進行分組。

GROUP BY 子句中在使用位置語法和結果集列名進行分組時,其對應的 SELECT 列表中的表達式不能是聚集函數。

該子句對行進行分組,但不保證結果集的順序。若要對分組進行排序,請使用 ORDER BY 子句

PARTITION BY

PARTITION BY 子句是 TDengine 3.0版本引入的特色語法,用于根據 part_list 對數據進行切分,在每個切分的分片中可以進行各種計算。

PARTITION BY 與 GROUP BY 基本含義相似,都是按照指定列表進行數據分組然后進行計算,不同點在于 PARTITION BY 沒有 GROUP BY 子句的 SELECT 列表的各種限制,組內可以進行任意運算(常量、聚合、標量、表達式等),因此在使用上 PARTITION BY 完全兼容 GROUP BY,所有使用 GROUP BY 子句的地方都可以替換為 PARTITION BY, 需要注意的是在沒有聚合查詢時兩者的查詢結果可能存在差異。

因為 PARTITION BY 沒有返回一行聚合數據的要求,因此還可以支持在分組切片后的各種窗口運算,所有需要分組進行的窗口運算都只能使用 PARTITION BY 子句。

詳見 TDengine 特色查詢

ORDER BY

ORDER BY 子句對結果集排序。如果沒有指定 ORDER BY,無法保證同一語句多次查詢的結果集返回順序一致。

ORDER BY 后可以使用位置語法,位置標識為正整數,從 1 開始,表示使用 SELECT 列表的第幾個表達式進行排序。

ASC 表示升序,DESC 表示降序。

NULLS 語法用來指定 NULL 值在排序中輸出的位置。NULLS LAST 是升序的默認值,NULLS FIRST 是降序的默認值。

LIMIT

LIMIT 控制輸出條數,OFFSET 指定從第幾條之后開始輸出。LIMIT/OFFSET 對結果集的執行順序在 ORDER BY 之后。LIMIT 5 OFFSET 2 可以簡寫為 LIMIT 2, 5,都輸出第 3 行到第 7 行數據。

在有 PARTITION BY/GROUP BY 子句時,LIMIT 控制的是每個切分的分片中的輸出,而不是總的結果集輸出。

SLIMIT

SLIMIT 和 PARTITION BY/GROUP BY 子句一起使用,用來控制輸出的分片的數量。SLIMIT 5 SOFFSET 2 可以簡寫為 SLIMIT 2, 5,都表示輸出第 3 個到第 7 個分片。

需要注意,如果有 ORDER BY 子句,則輸出只有一個分片。

特殊功能

部分特殊的查詢功能可以不使用 FROM 子句執行。

獲取當前數據庫

下面的命令可以獲取當前所在的數據庫 database(),如果登錄的時候沒有指定默認數據庫,且沒有使用USE命令切換數據,則返回 NULL。

SELECT DATABASE();

獲取服務器和客戶端版本號

SELECT CLIENT_VERSION();
SELECT SERVER_VERSION();

獲取服務器狀態

服務器狀態檢測語句。如果服務器正常,返回一個數字(例如 1)。如果服務器異常,返回 error code。該 SQL 語法能兼容連接池對于 TDengine 狀態的檢查及第三方工具對于數據庫服務器狀態的檢查。并可以避免出現使用了錯誤的心跳檢測 SQL 語句導致的連接池連接丟失的問題。

SELECT SERVER_STATUS();

獲取當前時間

SELECT NOW();

獲取當前日期

SELECT TODAY();

獲取當前時區

SELECT TIMEZONE();

獲取當前用戶

SELECT CURRENT_USER();

正則表達式過濾

語法

WHERE (column|tbname) match/MATCH/nmatch/NMATCH _regex_

正則表達式規范

確保使用的正則表達式符合 POSIX 的規范,具體規范內容可參見Regular Expressions

使用限制

只能針對表名(即 tbname 篩選)、binary/nchar 類型值進行正則表達式過濾。

正則匹配字符串長度不能超過 128 字節。可以通過參數 maxRegexStringLen 設置和調整最大允許的正則匹配字符串,該參數是客戶端配置參數,需要重啟才能生效。

CASE 表達式

語法

CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END
CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END

說明

TDengine 通過 CASE 表達式讓用戶可以在 SQL 語句中使用 IF … THEN … ELSE 邏輯。

第一種 CASE 語法返回第一個 value 等于 compare_value 的 result,如果沒有 compare_value 符合,則返回 ELSE 之后的 result,如果沒有 ELSE 部分,則返回 NULL。

第二種語法返回第一個 condition 為真的 result。 如果沒有 condition 符合,則返回 ELSE 之后的 result,如果沒有 ELSE 部分,則返回 NULL。

CASE 表達式的返回類型為第一個 WHEN THEN 部分的 result 類型,其余 WHEN THEN 部分和 ELSE 部分,result 類型都需要可以向其轉換,否則 TDengine 會報錯。

示例

某設備有三個狀態碼,顯示其狀態,語句如下:

SELECT CASE dev_status WHEN 1 THEN 'Running' WHEN 2 THEN 'Warning' WHEN 3 THEN 'Downtime' ELSE 'Unknown' END FROM dev_table;

統計智能電表的電壓平均值,當電壓小于 200 或大于 250 時認為是統計有誤,修正其值為 220,語句如下:

SELECT AVG(CASE WHEN voltage < 200 or voltage > 250 THEN 220 ELSE voltage END) FROM meters;

JOIN 子句

在 3.3.0.0 版本之前 TDengine 只支持內連接,自 3.3.0.0 版本起 TDengine 支持了更為廣泛的 JOIN 類型,這其中既包括傳統數據庫中的 LEFT JOIN、RIGHT JOIN、FULL JOIN、SEMI JOIN、ANTI-SEMI JOIN,也包括時序庫中特色的 ASOF JOIN、WINDOW JOIN。JOIN 操作支持在子表、普通表、超級表以及子查詢間進行。

示例

普通表與普通表之間的 JOIN 操作:

SELECT *
FROM temp_tb_1 t1, pressure_tb_1 t2
WHERE t1.ts = t2.ts

超級表與超級表之間的 LEFT JOIN 操作:

SELECT *
FROM temp_stable t1 LEFT JOIN temp_stable t2
ON t1.ts = t2.ts AND t1.deviceid = t2.deviceid AND t1.status=0;

子表與超級表之間的 LEFT ASOF JOIN 操作:

SELECT *
FROM temp_ctable t1 LEFT ASOF JOIN temp_stable t2
ON t1.ts = t2.ts AND t1.deviceid = t2.deviceid;

更多 JOIN 操作相關介紹參見頁面 TDengine 關聯查詢

嵌套查詢

“嵌套查詢”又稱為“子查詢”,也即在一條 SQL 語句中,“內層查詢”的計算結果可以作為“外層查詢”的計算對象來使用。

從 2.2.0.0 版本開始,TDengine 的查詢引擎開始支持在 FROM 子句中使用非關聯子查詢(“非關聯”的意思是,子查詢不會用到父查詢中的參數)。也即在普通 SELECT 語句的 tb_name_list 位置,用一個獨立的 SELECT 語句來代替(這一 SELECT 語句被包含在英文圓括號內),于是完整的嵌套查詢 SQL 語句形如:

SELECT ... FROM (SELECT ... FROM ...) ...;

:::info

  • 內層查詢的返回結果將作為“虛擬表”供外層查詢使用,此虛擬表建議起別名,以便于外層查詢中方便引用。
  • 外層查詢支持直接通過列名或`列名`的形式引用內層查詢的列或偽列。
  • 在內層和外層查詢中,都支持普通的表間/超級表間 JOIN。內層查詢的計算結果也可以再參與數據子表的 JOIN 操作。
  • 內層查詢支持的功能特性與非嵌套的查詢語句能力是一致的。
    • 內層查詢的 ORDER BY 子句一般沒有意義,建議避免這樣的寫法以免無謂的資源消耗。
  • 與非嵌套的查詢語句相比,外層查詢所能支持的功能特性存在如下限制:
    • 計算函數部分:
      • 如果內層查詢的結果數據未提供時間戳,那么計算過程隱式依賴時間戳的函數在外層會無法正常工作。例如:INTERP、DERIVATIVE、IRATE、LAST_ROW、FIRST、LAST、TWA、STATEDURATION、TAIL、UNIQUE。
      • 如果內層查詢的結果數據不是按時間戳有序,那么計算過程依賴數據按時間有序的函數在外層會無法正常工作。例如:LEASTSQUARES、ELAPSED、INTERP、DERIVATIVE、IRATE、TWA、DIFF、STATECOUNT、STATEDURATION、CSUM、MAVG、TAIL、UNIQUE。
      • 計算過程需要兩遍掃描的函數,在外層查詢中無法正常工作。例如:此類函數包括:PERCENTILE。

:::

UNION 子句

SELECT ...
UNION [ALL] SELECT ...
[UNION [ALL] SELECT ...]

TDengine 支持 UNION [ALL] 操作符。也就是說,如果多個 SELECT 子句返回結果集的結構完全相同(列名、列類型、列數、順序),那么可以通過 UNION [ALL] 把這些結果集合并到一起。

SQL 示例

對于下面的例子,表 tb1 用以下語句創建:

CREATE TABLE tb1 (ts TIMESTAMP, col1 INT, col2 FLOAT, col3 BINARY(50));

查詢 tb1 剛過去的一個小時的所有記錄:

SELECT * FROM tb1 WHERE ts >= NOW - 1h;

查詢表 tb1 從 2018-06-01 08:00:00.000 到 2018-06-02 08:00:00.000 時間范圍,并且 col3 的字符串是’nny’結尾的記錄,結果按照時間戳降序:

SELECT * FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND ts <= '2018-06-02 08:00:00.000' AND col3 LIKE '%nny' ORDER BY ts DESC;

查詢 col1 與 col2 的和,并取名 complex,時間大于 2018-06-01 08:00:00.000,col2 大于 1.2,結果輸出僅僅 10 條記錄,從第 5 條開始:

SELECT (col1 + col2) AS 'complex' FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND col2 > 1.2 LIMIT 10 OFFSET 5;

查詢過去 10 分鐘的記錄,col2 的值大于 3.14,并且將結果輸出到文件 /home/testoutput.csv

SELECT COUNT(*) FROM tb1 WHERE ts >= NOW - 10m AND col2 > 3.14 >> /home/testoutput.csv;

訪問官網

更多內容歡迎訪問 TDengine 官網

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

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

相關文章

Apache nifi demo 實驗

Apache nifi 是個數據流系統&#xff0c;可以通過配置 自定義的流程來實現數據的轉換。 比如可以配置一個流程&#xff0c;讀取數據庫里的數據&#xff0c;再轉換&#xff0c;最后保存到本地文件。 這樣可以來實現一些數據轉換的操作&#xff0c;而不用特地編寫程序來導入導出。…

javascript一些原生方法記錄

Element.scrollIntoView() Element 接口的 scrollIntoView() 方法會滾動元素的父容器&#xff0c;使被調用 scrollIntoView() 的元素對用戶可見。 structuredClone() 方法 Window 接口的 structuredClone() 方法使用結構化克隆算法將給定的值進行深拷貝。

記一次ScopeSentry搭建

介紹 Scope Sentry是一款具有資產測繪、子域名枚舉、信息泄露檢測、漏洞掃描、目錄掃描、子域名接管、爬蟲、頁面監控功能的工具&#xff0c;通過構建多個節點&#xff0c;自由選擇節點運行掃描任務。當出現新漏洞時可以快速排查關注資產是否存在相關組件。 目前功能 插件系…

Spring提供的SPEL表達式

SPEL 1. 概述 SpEL是Spring框架中用于表達式語言的一種方式。它類似于其他編程語言中的表達式語言&#xff0c;用于在運行時計算值或執行特定任務。 SpEL提供了一種簡單且強大的方式來訪問和操作對象的屬性、調用對象的方法&#xff0c;以及實現運算、條件判斷等操作。它可以…

【Azure 架構師學習筆記】- Azure Databricks (14) -- 搭建Medallion Architecture part 2

本文屬于【Azure 架構師學習筆記】系列。 本文屬于【Azure Databricks】系列。 接上文 【Azure 架構師學習筆記】- Azure Databricks (13) – 搭建Medallion Architecture part 1 前言 上文搭建了ADB 與外部的交互部分&#xff0c;本篇搭建ADB 內部配置來滿足medallion 架構。…

vulnhub靶場之【digitalworld.local系列】的torment靶機

前言 靶機&#xff1a;digitalworld.local-torment&#xff0c;IP地址為192.168.10.12 攻擊&#xff1a;kali&#xff0c;IP地址為192.168.10.6 kali采用VMware虛擬機&#xff0c;靶機選擇使用VMware打開文件&#xff0c;都選擇橋接網絡 這里官方給的有兩種方式&#xff0c…

docker-compose部署mongodb副本集集群

生成密鑰文件 ? openssl rand -base64 756 > mongodb.key chmod 400 mongodb.key # 權限必須為400?:ml-citation{ref="4" data="citationList"} chown 999:999 mongodb.key # MongoDB容器用戶ID為999?:ml-citation{ref="4" data="…

k8s v1.28.15部署(kubeadm方式)

k8s部署&#xff08;kubeadm方式&#xff09; 部署環境及版本 系統版本&#xff1a;CentOS Linux release 7.9.2009 k8s版本&#xff1a;v1.28.15 docker版本&#xff1a;26.1.4 containerd版本&#xff1a;1.6.33 calico版本&#xff1a;v3.25.0準備 主機ip主機名角色配置1…

Redis特性總結

一、速度快 正常情況下&#xff0c;Redis 執?命令的速度?常快&#xff0c;官?給出的數字是讀寫性能可以達到 10 萬 / 秒&#xff0c;當然這也取決于機器的性能&#xff0c;但這?先不討論機器性能上的差異&#xff0c;只分析?下是什么造就了 Redis 如此之快&#xff0c;可以…

C# Unity 面向對象補全計劃 之 索引器與迭代器

本文僅作學習筆記與交流&#xff0c;不作任何商業用途&#xff0c;作者能力有限&#xff0c;如有不足還請斧正 本篇有部分內容出自唐老獅,唐老師網站指路:全部 - 游習堂 - 唐老獅創立的游戲開發在線學習平臺 - Powered By EduSoho 目錄 1.索引器 2.迭代器 1.索引器 我的理解 索…

深度學習PyTorch之13種模型精度評估公式及調用方法

深度學習pytorch之22種損失函數數學公式和代碼定義 深度學習pytorch之19種優化算法&#xff08;optimizer&#xff09;解析 深度學習pytorch之4種歸一化方法&#xff08;Normalization&#xff09;原理公式解析和參數使用 深度學習pytorch之簡單方法自定義9類卷積即插即用 實時…

C++ Primer 拷貝控制和資源管理

歡迎閱讀我的 【CPrimer】專欄 專欄簡介&#xff1a;本專欄主要面向C初學者&#xff0c;解釋C的一些基本概念和基礎語言特性&#xff0c;涉及C標準庫的用法&#xff0c;面向對象特性&#xff0c;泛型特性高級用法。通過使用標準庫中定義的抽象設施&#xff0c;使你更加適應高級…

【無監督學習】層次聚類步驟及matlab實現

層次聚類 &#xff08;四&#xff09;層次聚類1.算法步驟2.MATLAB 實現參考資料 &#xff08;四&#xff09;層次聚類 層次聚類是一種通過逐層合并或分裂數據點構建樹狀結構&#xff08;樹狀圖&#xff0c;Dendrogram&#xff09;的聚類方法。它分為兩種類型&#xff1a; 凝聚…

02 HarmonyOS Next儀表盤案例詳解(一):基礎篇

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; 文章目錄 1. 項目概述2. 技術架構2.1 文件結構2.2 ArkTS 語言特性裝飾器的使用 3. 數據結構設計3.1 接口定義3.2 數據初始化 4. 生命周期與頁面路由…

微信小程序接入deepseek

先上效果 話不多說&#xff0c;直接上代碼&#xff08;本人用的hbuilder Xuniapp&#xff09; <template><view class"container"><!-- 聊天內容區域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…

istio入門到精通-2

上部分講到了hosts[*] 匹配所有的微服務&#xff0c;這部分細化一下 在 Istio 的 VirtualService 配置中&#xff0c;hosts 字段用于指定該虛擬服務適用的 目標主機或域名。如果使用具體的域名&#xff08;如 example.com&#xff09;&#xff0c;則只有請求的主機 域名與 exa…

6. PromQL的metric name(在node exporter復制下來交給AI解釋的)

目錄 前言&#xff1a; Go 運行時指標&#xff1a; Go 內存統計指標&#xff1a; CPU 指標&#xff1a; 內存指標&#xff1a; 磁盤指標&#xff1a; 網絡指標&#xff1a; 系統指標&#xff1a; 前言&#xff1a; 寫這個得目的是為了后續方便查詢&#xff0c;因為在pro…

圖像形成與計算機視覺基礎

1. 圖像形成的基本原理 圖像形成是物理世界與傳感器&#xff08;如膠片、CCD/CMOS&#xff09;交互的過程&#xff0c;核心是光線的傳播與記錄。 1.1 直接放置膠片模型 物理原理&#xff1a;物體表面反射的光線直接照射到膠片上&#xff0c;但無任何遮擋或聚焦機制。 問題&a…

Dockerfile概述及編輯

文章目錄 Docker 鏡像原理操作系統組成部分Docker 鏡像原理鏡像制作 Dockerfile概念及作用Dockerfile 概念Dockerfile 作用 Dockerfile關鍵字 案例要求實現步驟 Docker 鏡像原理 操作系統組成部分 操作系統組成&#xff1a;進程調度子系統、進程通信子系統、內存管理子系統、…

CES Asia 2025:AR/VR/XR論壇峰會備受矚目

CES Asia 2025第七屆亞洲消費電子技術貿易展&#xff08;賽逸展&#xff09;將在首都北京心盛大舉行。作為亞洲極具影響力的消費電子技術展會&#xff0c;此次盛會以“科技重塑生活&#xff0c;創新定義未來”為主題&#xff0c;預計將吸引全球500展商、100,000專業觀眾參與&am…