Hive-07之企業級調優

????????hive的企業級調優

1、Fetch抓取
  • Fetch抓取是指,Hive中對某些情況的查詢可以不必使用MapReduce計算

    • 例如:select * from score;
    • 在這種情況下,Hive可以簡單地讀取employee對應的存儲目錄下的文件,然后輸出查詢結果到控制臺
  • 在hive-default.xml.template文件中 hive.fetch.task.conversion默認是more,老版本hive默認是minimal,該屬性修改為more以后,在全局查找、字段查找、limit查找等都不走mapreduce。

  • 案例實操

    • 把 hive.fetch.task.conversion設置成**none**,然后執行查詢語句,都會執行mapreduce程序
    set hive.fetch.task.conversion=none;
    select * from score;
    select s_id from score;
    select s_id from score limit 3;
    
    • 把hive.fetch.task.conversion設置成==more==,然后執行查詢語句,如下查詢方式都不會執行mapreduce程序。
    set hive.fetch.task.conversion=more;
    select * from score;
    select s_id from score;
    select s_id from score limit 3;
    
2、本地模式
  • 在Hive客戶端測試時,默認情況下是啟用hadoop的job模式,把任務提交到集群中運行,這樣會導致計算非常緩慢;

  • Hive可以通過本地模式在單臺機器上處理任務。對于小數據集,執行時間可以明顯被縮短。

  • 案例實操

    --開啟本地模式,并執行查詢語句
    set hive.exec.mode.local.auto=true;  //開啟本地mr--設置local mr的最大輸入數據量,當輸入數據量小于這個值時采用local  mr的方式,
    --默認為134217728,即128M
    set hive.exec.mode.local.auto.inputbytes.max=50000000;--設置local mr的最大輸入文件個數,當輸入文件個數小于這個值時采用local mr的方式,
    --默認為4
    set hive.exec.mode.local.auto.input.files.max=5;--執行查詢的sql語句
    select * from student cluster by s_id;
    
--關閉本地運行模式
set hive.exec.mode.local.auto=false;
select * from student cluster by s_id;
3、表的優化
1 小表、大表 join
  • 將key相對分散,并且數據量小的表放在join的左邊,這樣可以有效減少內存溢出錯誤發生的幾率;再進一步,可以使用map join讓小的維度表(1000條以下的記錄條數)先進內存。在map端完成reduce。

    select  count(distinct s_id)  from score;select count(s_id) from score group by s_id; 在map端進行聚合,效率更高
    
  • 實際測試發現:新版的hive已經對小表 join 大表和大表 join 小表進行了優化。小表放在左邊和右邊已經沒有明顯區別。

  • 多個表關聯時,最好分拆成小段,避免大sql(無法控制中間Job)

2 大表 join 大表
  • 1.空 key 過濾

    • 有時join超時是因為某些key對應的數據太多,而相同key對應的數據都會發送到相同的reducer上,從而導致內存不夠。

    • 此時我們應該仔細分析這些異常的key,很多情況下,這些key對應的數據是異常數據,我們需要在SQL語句中進行過濾。

    • 測試環境準備:

      use myhive;
      create table ori(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';create table nullidtable(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';create table jointable(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';load data local inpath '/kkb/install/hivedatas/hive_big_table/*' into table ori; 
      load data local inpath '/kkb/install/hivedatas/hive_have_null_id/*' into table nullidtable;
      

      過濾空key與不過濾空key的結果比較

      不過濾:
      INSERT OVERWRITE TABLE jointable
      SELECT a.* FROM nullidtable a JOIN ori b ON a.id = b.id;
      結果:
      No rows affected (152.135 seconds)過濾:
      INSERT OVERWRITE TABLE jointable
      SELECT a.* FROM (SELECT * FROM nullidtable WHERE id IS NOT NULL ) a JOIN ori b ON a.id = b.id;
      結果:
      No rows affected (141.585 seconds)
      
  • 2、空 key 轉換

    • 有時雖然某個 key 為空對應的數據很多,但是相應的數據不是異常數據,必須要包含在 join 的結果中,此時我們可以表 a 中 key 為空的字段賦一個隨機的值,使得數據隨機均勻地分不到不同的 reducer 上。

      不隨機分布:

      set hive.exec.reducers.bytes.per.reducer=32123456;
      set mapreduce.job.reduces=7;
      INSERT OVERWRITE TABLE jointable
      SELECT a.*
      FROM nullidtable a
      LEFT JOIN ori b ON CASE WHEN a.id IS NULL THEN 'hive' ELSE a.id END = b.id;
      No rows affected (41.668 seconds)  

      結果:這樣的后果就是所有為null值的id全部都變成了相同的字符串,及其容易造成數據的傾斜(所有的key相同,相同key的數據會到同一個reduce當中去)

      為了解決這種情況,我們可以通過hive的rand函數,隨記的給每一個為空的id賦上一個隨機值,這樣就不會造成數據傾斜

    ? 隨機分布:

    set hive.exec.reducers.bytes.per.reducer=32123456;
    set mapreduce.job.reduces=7;
    INSERT OVERWRITE TABLE jointable
    SELECT a.*
    FROM nullidtable a
    LEFT JOIN ori b ON CASE WHEN a.id IS NULL THEN concat('hive', rand()) ELSE a.id END = b.id;No rows affected (42.594 seconds)              
    
3、大表join小表與小表join大表實測

需求:測試大表JOIN小表和小表JOIN大表的效率 (新的版本當中已經沒有區別了,舊的版本當中需要使用小表)

(1)建大表、小表和JOIN后表的語句

create table bigtable(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';create table smalltable(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';create table jointable2(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';

(2)分別向大表和小表中導入數據

hive (default)> load data local inpath '/kkb/install/hivedatas/big_data' into table bigtable;hive (default)>load data local inpath '/kkb/install/hivedatas/small_data' into table smalltable;
??3 map join
  • 如果不指定MapJoin 或者不符合 MapJoin的條件,那么Hive解析器會將Join操作轉換成Common Join,即:在Reduce階段完成join。容易發生數據傾斜。可以用 MapJoin 把小表全部加載到內存在map端進行join,避免reducer處理。

  • 1、開啟MapJoin參數設置

     --默認為true
    set hive.auto.convert.join = true;
    
  • 2、大表小表的閾值設置(默認25M一下認為是小表)

set hive.mapjoin.smalltable.filesize=26214400;
  • 3、MapJoin工作機制

在這里插入圖片描述

首先是Task A,它是一個Local Task(在客戶端本地執行的Task),負責掃描小表b的數據,將其轉換成一個HashTable的數據結構,并寫入本地的文件中,之后將該文件加載到DistributeCache中。

接下來是Task B,該任務是一個沒有Reduce的MR,啟動MapTasks掃描大表a,在Map階段,根據a的每一條記錄去和DistributeCache中b表對應的HashTable關聯,并直接輸出結果。

由于MapJoin沒有Reduce,所以由Map直接輸出結果文件,有多少個Map Task,就有多少個結果文件。

案例實操:

(1)開啟Mapjoin功能

set hive.auto.convert.join = true; 默認為true

(2)執行小表JOIN大表語句

INSERT OVERWRITE TABLE jointable2
SELECT b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
FROM smalltable s
JOIN bigtable  b
ON s.id = b.id;Time taken: 31.814 seconds

(3)執行大表JOIN小表語句

INSERT OVERWRITE TABLE jointable2
SELECT b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_url
FROM bigtable  b
JOIN smalltable  s
ON s.id = b.id;Time taken: 28.46 seconds
4 group By
  • 默認情況下,Map階段同一Key數據分發給一個reduce,當一個key數據過大時就傾斜了。

  • 并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端進行部分聚合,最后在Reduce端得出最終結果。

  • 開啟Map端聚合參數設置

    --是否在Map端進行聚合,默認為True
    set hive.map.aggr = true;
    --在Map端進行聚合操作的條目數目
    set hive.groupby.mapaggr.checkinterval = 100000;
    --有數據傾斜的時候進行負載均衡(默認是false)
    set hive.groupby.skewindata = true;當選項設定為 true,生成的查詢計劃會有兩個MR Job。第一個MR Job中,Map的輸出結果會隨機分布到Reduce中,每個Reduce做部分聚合操作,并輸出結果,這樣處理的結果是相同的Group By Key有可能被分發到不同的Reduce中,從而達到負載均衡的目的;第二個MR Job再根據預處理的數據結果按照Group By Key分布到Reduce中(這個過程可以保證相同的Group By Key被分布到同一個Reduce中),最后完成最終的聚合操作。
    
5 count(distinct)
  • 數據量小的時候無所謂,數據量大的情況下,由于count distinct 操作需要用一個reduce Task來完成,這一個Reduce需要處理的數據量太大,就會導致整個Job很難完成,一般count distinct使用先group by 再count的方式替換

    環境準備:

    create table bigtable(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';load data local inpath '/kkb/install/hivedatas/data/100萬條大表數據(id除以10取整)/bigtable' into table bigtable;--每個reduce任務處理的數據量 默認256000000(256M)set hive.exec.reducers.bytes.per.reducer=32123456;select  count(distinct ip )  from log_text;轉換成set hive.exec.reducers.bytes.per.reducer=32123456;select count(ip) from (select ip from log_text group by ip) t;雖然會多用一個Job來完成,但在數據量大的情況下,這個絕對是值得的。
    
6 笛卡爾積
  • 盡量避免笛卡爾積,即避免join的時候不加on條件,或者無效的on條件
  • Hive只能使用1個reducer來完成笛卡爾積。
??4、使用分區剪裁、列剪裁
  • 盡可能早地過濾掉盡可能多的數據量,避免大量數據流入外層SQL。
  • 列剪裁
    • 只獲取需要的列的數據,減少數據輸入。
  • 分區裁剪
    • 分區在hive實質上是目錄,分區裁剪可以方便直接地過濾掉大部分數據。
    • 盡量使用分區過濾,少用select *

? 環境準備:

create table ori(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';create table bigtable(id bigint, time bigint, uid string, keyword string, url_rank int, click_num int, click_url string) row format delimited fields terminated by '\t';load data local inpath '/home/admin/softwares/data/加遞增id的原始數據/ori' into table ori;load data local inpath '/home/admin/softwares/data/100萬條大表數據(id除以10取整)/bigtable' into table bigtable;

先關聯再Where:

SELECT a.id
FROM bigtable a
LEFT JOIN ori b ON a.id = b.id
WHERE b.id <= 10;

正確的寫法是寫在ON后面:先Where再關聯

SELECT a.id
FROM ori a
LEFT JOIN bigtable b ON (a.id <= 10 AND a.id = b.id);

或者直接寫成子查詢:

SELECT a.id
FROM bigtable a
RIGHT JOIN (SELECT id
FROM ori
WHERE id <= 10
) b ON a.id = b.id;
5、并行執行
  • 把一個sql語句中沒有相互依賴的階段并行去運行。提高集群資源利用率
--開啟并行執行
set hive.exec.parallel=true;
--同一個sql允許最大并行度,默認為8。
set hive.exec.parallel.thread.number=16;
6、嚴格模式
  • Hive提供了一個嚴格模式,可以防止用戶執行那些可能意想不到的不好的影響的查詢。

  • 通過設置屬性hive.mapred.mode值為默認是非嚴格模式nonstrict 。開啟嚴格模式需要修改hive.mapred.mode值為strict,開啟嚴格模式可以禁止3種類型的查詢。

    --設置非嚴格模式(默認)
    set hive.mapred.mode=nonstrict;--設置嚴格模式
    set hive.mapred.mode=strict;
    
  • (1)對于分區表,除非where語句中含有分區字段過濾條件來限制范圍,否則不允許執行

    --設置嚴格模式下 執行sql語句報錯; 非嚴格模式下是可以的
    select * from order_partition;異常信息:Error: Error while compiling statement: FAILED: SemanticException [Error 10041]: No partition predicate found for Alias "order_partition" Table "order_partition" 
    
  • (2)對于使用了order by語句的查詢,要求必須使用limit語句

    --設置嚴格模式下 執行sql語句報錯; 非嚴格模式下是可以的
    select * from order_partition where month='2019-03' order by order_price; 異常信息:Error: Error while compiling statement: FAILED: SemanticException 1:61 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'order_price'
    
  • (3)限制笛卡爾積的查詢

    • 嚴格模式下,避免出現笛卡爾積的查詢
7、JVM重用
  • JVM重用是Hadoop調優參數的內容,其對Hive的性能具有非常大的影響,特別是對于很難避免小文件的場景或task特別多的場景,這類場景大多數執行時間都很短。

    Hadoop的默認配置通常是使用派生JVM來執行map和Reduce任務的。這時JVM的啟動過程可能會造成相當大的開銷,尤其是執行的job包含有成百上千task任務的情況。JVM重用可以使得JVM實例在同一個job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中進行配置。通常在10-20之間,具體多少需要根據具體業務場景測試得出。

    <property><name>mapreduce.job.jvm.numtasks</name><value>10</value><description>How many tasks to run per jvm. If set to -1, there isno limit. </description>
    </property>

    我們也可以在hive當中通過

     set  mapred.job.reuse.jvm.num.tasks=10;
    

    這個設置來設置我們的jvm重用

    這個功能的缺點是,開啟JVM重用將一直占用使用到的task插槽,以便進行重用,直到任務完成后才能釋放。如果某個“不平衡的”job中有某幾個reduce task執行的時間要比其他Reduce task消耗的時間多的多的話,那么保留的插槽就會一直空閑著卻無法被其他的job使用,直到所有的task都結束了才會釋放。

8、推測執行
  • 在分布式集群環境下,因為程序Bug(包括Hadoop本身的bug),負載不均衡或者資源分布不均等原因,會造成同一個作業的多個任務之間運行速度不一致,有些任務的運行速度可能明顯慢于其他任務(比如一個作業的某個任務進度只有50%,而其他所有任務已經運行完畢),則這些任務會拖慢作業的整體執行進度。為了避免這種情況發生,Hadoop采用了推測執行(Speculative Execution)機制,它根據一定的法則推測出“拖后腿”的任務,并為這樣的任務啟動一個備份任務,讓該任務與原始任務同時處理同一份數據,并最終選用最先成功運行完成任務的計算結果作為最終結果。

    設置開啟推測執行參數:Hadoop的mapred-site.xml文件中進行配置

<property><name>mapreduce.map.speculative</name><value>true</value><description>If true, then multiple instances of some map tasks may be executed in parallel.</description>
</property><property><name>mapreduce.reduce.speculative</name><value>true</value><description>If true, then multiple instances of some reduce tasks may be executed in parallel.</description>
</property>

不過hive本身也提供了配置項來控制reduce-side的推測執行:

  <property><name>hive.mapred.reduce.tasks.speculative.execution</name><value>true</value><description>Whether speculative execution for reducers should be turned on. </description></property>

關于調優這些推測執行變量,還很難給一個具體的建議。如果用戶對于運行時的偏差非常敏感的話,那么可以將這些功能關閉掉。如果用戶因為輸入數據量很大而需要執行長時間的map或者Reduce task的話,那么啟動推測執行造成的浪費是非常巨大大。

9、壓縮

? 參見數據的壓縮

  • Hive表中間數據壓縮

    #設置為true為激活中間數據壓縮功能,默認是false,沒有開啟
    set hive.exec.compress.intermediate=true;
    #設置中間數據的壓縮算法
    set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec;
  • Hive表最終輸出結果壓縮

    set hive.exec.compress.output=true;
    set mapred.output.compression.codec= 
    org.apache.hadoop.io.compress.SnappyCodec;
    
10、使用EXPLAIN(執行計劃)

查看hql執行計劃

????11、數據傾斜
1 合理設置Map數
    1. 通常情況下,作業會通過input的目錄產生一個或者多個map任務。
    主要的決定因素有:input的文件總個數,input的文件大小,集群設置的文件塊大小。舉例:
    a)  假設input目錄下有1個文件a,大小為780M,那么hadoop會將該文件a分隔成7個塊(6個128m的塊和1個12m的塊),從而產生7個map數。
    b) 假設input目錄下有3個文件a,b,c大小分別為10m,20m,150m,那么hadoop會分隔成4個塊(10m,20m,128m,22m),從而產生4個map數。即,如果文件大于塊大小(128m),那么會拆分,如果小于塊大小,則把該文件當成一個塊。
  • 2) 是不是map數越多越好?

      答案是否定的。如果一個任務有很多小文件(遠遠小于塊大小128m),則每個小文件也會被當做一個塊,用一個map任務來完成,而一個map任務啟動和初始化的時間遠遠大于邏輯處理的時間,就會造成很大的資源浪費。而且,同時可執行的map數是受限的。
    
  • 3) 是不是保證每個map處理接近128m的文件塊,就高枕無憂了?

    答案也是不一定。比如有一個127m的文件,正常會用一個map去完成,但這個文件只有一個或者兩個小字段,卻有幾千萬的記錄,如果map處理的邏輯比較復雜,用一個map任務去做,肯定也比較耗時。針對上面的問題2和3,我們需要采取兩種方式來解決:即減少map數和增加map數;
2 小文件合并
  • 在map執行前合并小文件,減少map數:

  • CombineHiveInputFormat 具有對小文件進行合并的功能(系統默認的格式)

    set mapred.max.split.size=112345600;
    set mapred.min.split.size.per.node=112345600;
    set mapred.min.split.size.per.rack=112345600;
    set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

    這個參數表示執行前進行小文件合并,前面三個參數確定合并文件塊的大小,大于文件塊大小128m的,按照128m來分隔,小于128m,大于100m的,按照100m來分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),進行合并。

3 復雜文件增加Map數
  • 當input的文件都很大,任務邏輯復雜,map執行非常慢的時候,可以考慮增加Map數,來使得每個map處理的數據量減少,從而提高任務的執行效率。

  • 增加map的方法為

    • 根據 ==computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))==公式
    • 調整maxSize最大值。讓maxSize最大值低于blocksize就可以增加map的個數。
    mapreduce.input.fileinputformat.split.minsize=1 默認值為1mapreduce.input.fileinputformat.split.maxsize=Long.MAXValue 默認值Long.MAXValue因此,默認情況下,切片大小=blocksize maxsize(切片最大值): 參數如果調到比blocksize小,則會讓切片變小,而且就等于配置的這個參數的值。minsize(切片最小值): 參數調的比blockSize大,則可以讓切片變得比blocksize還大。
    • 例如
    --設置maxsize大小為10M,也就是說一個fileSplit的大小為10M
    set mapreduce.input.fileinputformat.split.maxsize=10485760;
    
4 合理設置Reduce數
  • 1、調整reduce個數方法一

    • 1)每個Reduce處理的數據量默認是256MB

      set hive.exec.reducers.bytes.per.reducer=256000000;
      
      1. 每個任務最大的reduce數,默認為1009
      set hive.exec.reducers.max=1009;
      
      1. 計算reducer數的公式
      N=min(參數2,總輸入數據量/參數1)
      
  • 2、調整reduce個數方法二

    --設置每一個job中reduce個數
    set mapreduce.job.reduces=3;
    
  • 3、reduce個數并不是越多越好

    • 過多的啟動和初始化reduce也會消耗時間和資源;

    • 同時過多的reduce會生成很多個文件,也有可能出現小文件問題

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

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

相關文章

華為云 | 快速搭建DeepSeek推理系統

DeepSeek&#xff08;深度求索&#xff09;作為一款國產AI大模型&#xff0c;憑借其高性能、低成本和多模態融合能力&#xff0c;在人工智能領域崛起&#xff0c;并在多個行業中展現出廣泛的應用潛力。 如上所示&#xff0c;在華為云解決方案實踐中&#xff0c;華為云提供的快速…

Spring Boot 3 整合 MinIO 實現分布式文件存儲

引言 文件存儲已成為一個做任何應用都不可回避的需求。傳統的單機文件存儲方案在面對大規模數據和高并發訪問時往往力不從心&#xff0c;而分布式文件存儲系統則提供了更好的解決方案。本篇文章我將基于Spring Boot 3 為大家講解如何基于MinIO來實現分布式文件存儲。 分布式存…

3月5日作業

代碼作業&#xff1a; #!/bin/bash# 清空目錄函數 safe_clear_dir() {local dir"$1"local name"$2"if [ -d "$dir" ]; thenwhile true; doread -p "檢測到 $name 目錄已存在&#xff0c;請選擇操作&#xff1a; 1) 清空目錄內容 2) 保留目…

達夢數據庫關于參數PK_WITH_CLUSTER的改動分析

目錄 1、PK_WITH_CLUSTER取值為0 2、PK_WITH_CLUSTER取值為1 達夢數據庫的參數PK_WITH_CLUSTER在最近使用過程中發現與前期使用的版本存在差異&#xff0c;特此測試分析一下。具體哪個版本改動的暫未得知。 PK_WITH_CLUSTER&#xff0c;默認值為0&#xff0c;動態會話級參數。…

android11使用gpio口控制led狀態燈

目錄 一、簡介 二、解決方法 A、底層驅動 B、上層調用 C、驗證 一、簡介 1、需求&#xff1a;這里是用2個gpio口來控制LED燈&#xff0c;開機時默認亮藍燈&#xff0c;按開機鍵&#xff0c;休眠亮紅燈&#xff0c;喚醒亮藍燈。 原理圖&#xff1a; 這里由于主板上電阻R63…

windows 利用nvm 管理node.js 2025最新版

1.首先在下載nvm 下載鏈接 2. 下載最新版本的nvm 3. 同意協議 注意&#xff1a;選擇安裝路徑 之后一直下一步即可 可以取消勾選 open with Powershell 勾選后它會自動打開Powershell 這里選用cmd 輸入以下命令查看是否安裝成功 nvm version 查看已經安裝的版本 我之前自…

深入淺出:UniApp 從入門到精通全指南

https://juejin.cn/post/7440119937644101684 uni-app官網 本文是關于 UniApp 從入門到精通的全指南&#xff0c;涵蓋基礎入門&#xff08;環境搭建、創建項目、項目結構、編寫運行&#xff09;、核心概念與進階知識&#xff08;組件與開發、頁面路由與導航、數據綁定與響應式…

MySQL ——數據的增刪改查

一、DML語言 1.1 insert插入數據 語法&#xff1a;insert [into] 表名 [字段名] values(值列表)&#xff1b; 插入一行數據 第一種&#xff1a;insert into file1(id,name,age) values (1,‘aa’,11); 第二種&#xff1a;insert into file1 values(1,‘aa’,11); 插入多行數…

【CF記錄】貪心——A. Scrambled Scrabble

https://codeforces.com/contest/2045/problem/A 思路&#xff1a; 由于Y有兩種選擇&#xff0c;NG也是&#xff0c;那我們可以枚舉以下情況&#xff1a;選i個Y做輔音&#xff0c;j個NG做輔音 然后貪心選擇最長的即可&#xff0c;觀察到S最長為5000&#xff0c;即使是也不會…

C語言【指針篇】(四)

前言&#xff1a;正文1. 字符指針變量2. 數組指針變量2.1 數組指針變量是什么?2.2 數組指針變量怎么初始化 3. 二維數組傳參的本質4. 函數指針變量4.1 函數指針變量的創建4.2 函數指針變量的使用4.3 兩段有趣的代碼4.3.1 typedef關鍵字 5. 函數指針數組6. 轉移表 總結 前言&am…

React + TypeScript 實戰指南:用類型守護你的組件

TypeScript 為 React 開發帶來了強大的類型安全保障&#xff0c;這里解析常見的一些TS寫法&#xff1a; 一、組件基礎類型 1. 函數組件定義 // 顯式聲明 Props 類型并標注返回值 interface WelcomeProps {name: string;age?: number; // 可選屬性 }const Welcome: React.FC…

【玩轉正則表達式】將正則表達式中的分組(group)與替換進行結合使用

在文本處理和數據分析領域&#xff0c;正則表達式&#xff08;Regular Expressions&#xff0c;簡稱regex&#xff09;是一種功能強大的工具。它不僅能夠幫助我們匹配和搜索字符串中的特定模式&#xff0c;還能通過分組&#xff08;Grouping&#xff09;和替換&#xff08;Subs…

Flutter 學習之旅 之 flutter 不使用插件,簡單實現一個 Toast 功能

Flutter 學習之旅 之 flutter 不使用插件&#xff0c;簡單實現一個 Toast 功能 目錄 Flutter 學習之旅 之 flutter 不使用插件&#xff0c;簡單實現一個 Toast 功能 一、簡單介紹 二、簡單介紹 Toast 1. 確保正確配置 navigatorKey 2. 避免重復顯示 Toast 3. 確保 Toast …

《OpenCV》——dlib(人臉應用實例)

文章目錄 dlib庫dlib庫——人臉應用實例——表情識別dlib庫——人臉應用實例——疲勞檢測 dlib庫 dlib庫的基礎用法介紹可以參考這篇文章&#xff1a;https://blog.csdn.net/lou0720/article/details/145968062?spm1011.2415.3001.5331&#xff0c;故此這篇文章只介紹dlib的人…

學習日記-250305

閱讀論文&#xff1a;Leveraging Pedagogical Theories to Understand Student Learning Process with Graph-based Reasonable Knowledge Tracing ps:代碼邏輯最后一點還沒理順&#xff0c;明天繼續 4.2 Knowledge Memory & Knowledge Tracing 代碼研究&#xff1a; 一般…

【AI大模型】DeepSeek + Kimi 高效制作PPT實戰詳解

目錄 一、前言 二、傳統 PPT 制作問題 2.1 傳統方式制作 PPT 2.2 AI 大模型輔助制作 PPT 2.3 適用場景對比分析 2.4 最佳實踐與推薦 三、DeepSeek Kimi 高效制作PPT操作實踐 3.1 Kimi 簡介 3.2 DeepSeek Kimi 制作PPT優勢 3.2.1 DeepSeek 優勢 3.2.2 Kimi 制作PPT優…

【ESP-ADF】在 VSCode 安裝 ESP-ADF 注意事項

1.檢查網絡 如果您在中國大陸安裝&#xff0c;請使用魔法上網&#xff0c;避免無法 clone ESP-ADF 倉庫。 2.VSCode 安裝 ESP-ADF 在 VSCode 左側活動欄選擇 ESP-IDF:explorer&#xff0c;展開 advanced 并點擊 Install ESP-ADF 然后會出現選擇 ESP-ADF 安裝目錄。 如果出現…

關于2023新版PyCharm的使用

考慮到大家AI編程的需要&#xff0c;建議大家安裝新版Python解釋器和新版PyCharm&#xff0c;下載地址都可以官網進行&#xff1a; Python&#xff1a;Download Python | Python.org&#xff08;可以根據需要自行選擇&#xff0c;建議選擇3.11&#xff0c;保持交流版本一致&am…

輕松部署 Stable Diffusion WebUI 并實現局域網共享訪問:解決 Conda Python 版本不為 3.10.6 的難題

這篇博文主要為大家講解關于sd webui的部署問題&#xff0c;大家有什么不懂的可以隨時問我&#xff0c;如果沒有及時回復&#xff0c;可聯系&#xff1a;1198965922 如果后續大家需要了解怎么用代碼調用部署好的webui的接口&#xff0c;可以在評論區留言哦&#xff0c;博主可以…

Leetcode 103: 二叉樹的鋸齒形層序遍歷

Leetcode 103: 二叉樹的鋸齒形層序遍歷 問題描述&#xff1a; 給定一個二叉樹&#xff0c;返回其節點值的鋸齒形層序遍歷&#xff08;即第一層從左到右&#xff0c;第二層從右到左&#xff0c;第三層從左到右&#xff0c;依此類推&#xff09;。 適合面試的解法&#xff1a;廣…