Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 在线日韩视频,亚洲国产成人久久笫一页,丁香狠狠色婷婷久久综合

          整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          大數(shù)據(jù)從業(yè)者必知必會的Hive SQL調(diào)優(yōu)技巧

          大數(shù)據(jù)從業(yè)者必知必會的Hive SQL調(diào)優(yōu)技巧

          摘要:在大數(shù)據(jù)領(lǐng)域中,Hive SQL被廣泛應(yīng)用于數(shù)據(jù)倉庫的數(shù)據(jù)查詢和分析。然而,由于數(shù)據(jù)量龐大和復雜的查詢需求,Hive SQL查詢的性能往往不盡人意。本文針對Hive SQL的性能優(yōu)化進行深入研究,提出了一系列可行的調(diào)優(yōu)方案,并給出了相應(yīng)的優(yōu)化案例和優(yōu)化前后的SQL代碼。通過合理的優(yōu)化策略和技巧,能夠顯著提升Hive SQL的執(zhí)行效率和響應(yīng)速度。

          關(guān)鍵詞:Hive SQL;性能優(yōu)化;調(diào)優(yōu)方案;優(yōu)化案例

          1. 引言

          隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)分析和挖掘變得越來越重要。Hive作為Hadoop生態(tài)系統(tǒng)中的數(shù)據(jù)倉庫工具,扮演著重要的角色。然而,由于數(shù)據(jù)量龐大和查詢復雜性,Hive SQL查詢的執(zhí)行效率往往較低。因此,深入了解Hive SQL調(diào)優(yōu)技巧對于數(shù)據(jù)工程師和數(shù)據(jù)分析師來說至關(guān)重要。

          2. 先做個自我反思

          很多時候, Hive SQL 運行得慢是由開發(fā)人員對于使用的數(shù)據(jù)了解不夠以及一些不良的使用習慣引起的。

          ?真的需要掃描這么多分區(qū)嗎?

          比如,對于銷售明細事務(wù)表來說,掃描一年的分區(qū)和掃描一周的分區(qū)所帶來的計算、 IO 開銷完全是兩個量級,所耗費的時間肯定也是不同的。作為開發(fā)人員,我們需要仔細考慮業(yè)務(wù)的需求,盡量不要浪費計算和存儲資源。

          ?習慣使用select *這樣的方式,而不是用到哪些列就指定哪些列嗎?

          比如,select coll, col2 from ,另外, where 條件中也盡量添加過濾條件,以去掉無關(guān)的數(shù)據(jù)行,從而減少整個 任務(wù)中需要處理、分發(fā)的數(shù)據(jù)量。

          ?需要計算的指標真的需要從數(shù)據(jù)倉庫的公共明細層來自行匯總嗎?

          是不是數(shù)倉團隊開發(fā)的公共匯總層已經(jīng)可以滿足你的需求?對于通用的、管理者駕駛艙相關(guān)的指標等通常設(shè)計良好的數(shù)據(jù)倉庫公共層肯定已經(jīng)包含了,直接使用即可。

          實際生產(chǎn)中hive的應(yīng)用_實際生產(chǎn)中hive的應(yīng)用_實際生產(chǎn)中hive的應(yīng)用

          3 查詢優(yōu)化

          3.1 盡量原子化操作

          盡量避免一個SQL包含復雜邏輯,可以使用中間表來完成復雜的邏輯。建議對作業(yè)進行合理拆分,降低作業(yè)出問題重跑時資源的浪費和下游時效的影響。

          3.2 使用合適的數(shù)據(jù)類型

          選擇合適的數(shù)據(jù)類型可以減小存儲空間和提高查詢效率。例如,將字符串類型轉(zhuǎn)換為整型類型可以節(jié)省存儲空間并加快查詢速度。

          優(yōu)化案例

          優(yōu)化前:

          SELECT * FROM table WHERE age = '30'; 

          優(yōu)化后:

          SELECT * FROM table WHERE age = 30;

          3.3 避免全表掃描

          盡量避免全表掃描,可以通過WHERE子句篩選出需要的數(shù)據(jù)行,或者使用LIMIT子句限制返回結(jié)果的數(shù)量。

          反面案例

          天天全表掃描計算所有歷史數(shù)據(jù)。 map數(shù)超20萬。

          Select * from table where dt<=’{TX_DATE}’

          優(yōu)化案例1

          優(yōu)化前:

          --優(yōu)化前副表的過濾條件寫在where后面,會導致先全表關(guān)聯(lián)再過濾分區(qū)。

          select a.* from test1 a left join test2 b on a.uid = b.uid where a.ds='2020-08-10' and b.ds='2020-08-10' 

          優(yōu)化后:

          select a.* from test1 a left join test2 b on (b.uid is not null and a.uid = b.uid and b.ds='2020-08-10') where a.ds='2020-08-10'

          優(yōu)化案例2

          利用max函數(shù)取表最大分區(qū),造成全表掃描。

          優(yōu)化前:

          Select max(dt) from table

          優(yōu)化后:

          使用自定義(show partition 或 hdfs dfs –ls )的方式替代max(dt)

          3.4 使用分區(qū)

          數(shù)據(jù)分區(qū)是一種將數(shù)據(jù)按照某個字段進行分組存儲的技術(shù),可以有效減少查詢時的數(shù)據(jù)掃描量。通過分區(qū)字段進行數(shù)據(jù)過濾,可以只對目標分區(qū)進行查詢,加快查詢速度。

          優(yōu)化案例

          優(yōu)化前:

          SELECT * FROM table WHERE date = '2021-01-01' AND region = 'A';

          優(yōu)化后:

          SELECT * FROM table WHERE partition_date = '2021-01-01' AND partition_region = 'A';

          反面案例

          代碼寫死日期,一次性不合理掃描2年+日志數(shù)據(jù)。map數(shù)超20萬,而且會越來越大,直到跑不出來。

          Select * from table where src_mark=’23’ and dt between ‘2020-05-16’ and ‘{TX_DATE}’ and scr_code is not null

          3.5 使用索引

          在Hive SQL中,可以通過創(chuàng)建索引來加速查詢操作。通過在關(guān)鍵字段上創(chuàng)建索引,可以減少數(shù)據(jù)掃描和過濾的時間,提高查詢性能。

          優(yōu)化案例

          優(yōu)化前:

          SELECT * FROM table WHERE region = 'A' AND status = 'ACTIVE';

          優(yōu)化后:

          CREATE INDEX idx_region_status ON table (region, status);
          SELECT * FROM table WHERE region = 'A' AND status = 'ACTIVE';

          3.6 查詢重寫

          查詢重寫是一種通過改變查詢語句的結(jié)構(gòu)或使用優(yōu)化的查詢方式,來改善查詢的性能的技巧。可以通過重寫子查詢、使用JOIN代替IN/EXISTS子查詢等方法來優(yōu)化查詢。

          優(yōu)化案例

          優(yōu)化前:

          SELECT * FROM table1 WHERE id IN (SELECT id FROM table2 WHERE region = 'A');

          優(yōu)化后:

          SELECT * FROM table1 t1 JOIN (SELECT id FROM table2 WHERE region = 'A') t2 ON t1.id = t2.id;

          3.7 謂詞下推

          謂詞下推是一種將過濾條件盡早應(yīng)用于查詢計劃中的技術(shù)(即SQL語句中的WHERE謂詞邏輯都盡可能提前執(zhí)行),減少下游處理的數(shù)據(jù)量。通過將過濾條件下推至數(shù)據(jù)源,可以減少查詢數(shù)據(jù)量,提升查詢性能。

          優(yōu)化案例

          優(yōu)化前:

          select a.*,b.* from a join b  on a.name=b.name where a.age>30

          優(yōu)化后:

          SELECT a.*, b.* FROM ( SELECT * FROM a WHERE age > 30 ) a JOIN b ON a.name = b.name

          3.8 不要用COUNT

          實際生產(chǎn)中hive的應(yīng)用_實際生產(chǎn)中hive的應(yīng)用_實際生產(chǎn)中hive的應(yīng)用

          COUNT 操作需要用一個Reduce Task來完成,這一個Reduce需要處理的數(shù)據(jù)量太大,就會導致整個Job很難完成,一般COUNT 使用先GROUP BY再COUNT的方式替換,雖然會多用一個Job來完成,但在數(shù)據(jù)量大的情況下,這個絕對是值得的。

          優(yōu)化案例

          優(yōu)化前:

          select count(distinct uid) from test where ds='2020-08-10' and uid is not null

          優(yōu)化后:

          select count(a.uid) from (select uid from test where uid is not null and ds = '2020-08-10' group by uid) a

          3.9 使用with as

          拖慢hive查詢效率出了join產(chǎn)生的shuffle以外,還有一個就是子查詢,在SQL語句里面盡量減少子查詢。with as是將語句中用到的子查詢事先提取出來(類似臨時表),使整個查詢當中的所有模塊都可以調(diào)用該查詢結(jié)果。使用with as可以避免Hive對不同部分的相同子查詢進行重復計算。

          優(yōu)化案例

          優(yōu)化前:

          select a.* from test1 a left join test2 b on a.uid = b.uid where a.ds='2020-08-10' and b.ds='2020-08-10'

          優(yōu)化后:

          with b as select uid from test2 where ds = '2020-08-10' and uid is not null select a.* from test1 a left join b on a.uid = b.uid where a.ds='2020-08-10' and a.uid is not null

          3.10 大表Join小表

          在編寫具有Join操作的查詢語句時,有一項重要的原則需要遵循:應(yīng)當將記錄較少的表或子查詢放置在Join操作符的左側(cè)。這樣做有助于減少數(shù)據(jù)量,提高查詢效率,并有效降低內(nèi)存溢出錯誤的發(fā)生概率。

          如果未指定MapJoin,或者不符合MapJoin的條件,Hive解析器將會將Join操作轉(zhuǎn)換成Common Join。這意味著Join操作將在Reduce階段完成,由此可能導致數(shù)據(jù)傾斜的問題。為了避免這種情況,可以通過使用MapJoin將小表完全加載到內(nèi)存中,并在Map端執(zhí)行Join操作,從而避免將Join操作留給Reducer階段處理。這種策略有效地減少了數(shù)據(jù)傾斜的風險。

          優(yōu)化案例

          --設(shè)置自動選擇Mapjoin

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

          --大表小表的閾值設(shè)置(默認25M以下認為是小表):

          set hive.mapjoin.smalltable.filesize=25000000;

          3.11 大表Join大表

          3.11.1 空key過濾

          有時候,連接操作超時可能是因為某些key對應(yīng)的數(shù)據(jù)量過大。相同key的數(shù)據(jù)被發(fā)送到相同的reducer上,由此導致內(nèi)存不足。在這種情況下,我們需要仔細分析這些異常的key。通常,這些key對應(yīng)的數(shù)據(jù)可能是異常的,因此我們需要在SQL語句中進行適當?shù)倪^濾。

          3.11.2 空key轉(zhuǎn)換

          當某個key為空時,盡管對應(yīng)的數(shù)據(jù)很豐富,但并非異常情況。在執(zhí)行join操作時,這些數(shù)據(jù)必須包含在結(jié)果集中。為實現(xiàn)這一目的,可以考慮將表a中那些key為空的字段賦予隨機值,以確保數(shù)據(jù)能夠均勻、隨機地分布到不同的reducer上。

          3.12 避免笛卡爾積

          在執(zhí)行join操作時,若不添加有效的on條件或者使用無效的on條件,而是采用where條件,可能會面臨關(guān)聯(lián)列包含大量空值或者重復值的情況。這可能導致Hive只能使用一個reducer來完成操作,從而引發(fā)笛卡爾積和數(shù)據(jù)膨脹問題。因此,在進行join時,務(wù)必注意確保使用有效的關(guān)聯(lián)條件,以免由于數(shù)據(jù)的空值或重復值而影響操作性能。

          優(yōu)化案例

          優(yōu)化前:

          SELECT * FROM A, B; 

          --在優(yōu)化前的SQL代碼中,使用了隱式的內(nèi)連接(JOIN),沒有明確指定連接條件,導致產(chǎn)生了笛卡爾積

          優(yōu)化后;

          SELECT * FROM A CROSS JOIN B;

          在優(yōu)化后的SQL代碼中,使用了明確的交叉連接(CROSS JOIN),確保只返回A和B表中的所有組合,而不會產(chǎn)生重復的行。 通過明確指定連接方式,可以避免不必要的笛卡爾積操作,提高查詢效率。

          4. 數(shù)據(jù)加載和轉(zhuǎn)換

          4.1 使用壓縮格式

          在數(shù)據(jù)加載過程中,選擇合適的數(shù)據(jù)存儲格式(對于結(jié)構(gòu)化數(shù)據(jù),可以選擇Parquet或ORC等列式存儲格式;對于非結(jié)構(gòu)化數(shù)據(jù),可以選擇或等格式),可以提高查詢性能和減少存儲空間。

          優(yōu)化案例

          優(yōu)化前:

          LOAD DATA INPATH '/path/to/data' INTO TABLE table;

          優(yōu)化后:

          LOAD DATA INPATH '/path/to/data' INTO TABLE table STORED AS ORC;

          4.2 數(shù)據(jù)轉(zhuǎn)換和過濾

          在數(shù)據(jù)加載之前,對數(shù)據(jù)進行轉(zhuǎn)換和過濾可以減小數(shù)據(jù)量,并加快查詢速度。例如,可以使用Hive內(nèi)置函數(shù)對數(shù)據(jù)進行清洗和轉(zhuǎn)換,以滿足特定的查詢需求。

          優(yōu)化案例

          優(yōu)化前:

          SELECT * FROM table WHERE name LIKE '%John%'; 

          優(yōu)化后:

          SELECT * FROM table WHERE name = 'John';

          4.3 多次INSERT單次掃描表

          默認情況下,Hive會執(zhí)行多次表掃描。因此,如果要在某張hive表中執(zhí)行多個操作,建議使用一次掃描并使用該掃描來執(zhí)行多個操作。

          比如將一張表的數(shù)據(jù)多次查詢出來裝載到另外一張表中。如下面的示例,表是一個分區(qū)表,分區(qū)字段為dt,如果需要在表中查詢2個特定的分區(qū)日期數(shù)據(jù),并將記錄裝載到2個不同的表中。

          INSERT INTO temp_table_20201115 SELECT * FROM my_table WHERE dt ='2020-11-15';
          INSERT INTO temp_table_20201116 SELECT * FROM my_table WHERE dt ='2020-11-16';

          在以上查詢中,Hive將掃描表2次,為了避免這種情況,我們可以使用下面的方式:

          FROM my_table
          INSERT INTO temp_table_20201115 SELECT * WHERE dt ='2020-11-15'
          INSERT INTO temp_table_20201116 SELECT * WHERE dt ='2020-11-16'

          這樣可以確保只對表執(zhí)行一次掃描,從而可以大大減少執(zhí)行的時間和資源。

          5. 性能評估和優(yōu)化

          5.1 使用EXPLAIN命令

          使用EXPLAIN命令可以分析查詢計劃并評估查詢的性能。通過查看查詢計劃中的資源消耗情況,可以找出潛在的性能問題,并進行相應(yīng)的優(yōu)化。

          優(yōu)化案例

          優(yōu)化前:

          EXPLAIN SELECT * FROM table WHERE age = 30; 

          優(yōu)化后:

          EXPLAIN SELECT * FROM table WHERE age = 30 AND partition = 'partition1'; 

          5.2 調(diào)整并行度和資源配置

          根據(jù)集群的配置和資源情況,合理調(diào)整Hive查詢的并行度和資源分配,可以提高查詢的并發(fā)性和整體性能。通過設(shè)置參數(shù)hive.exec.值為true,就可以開啟并發(fā)執(zhí)行。不過,在共享集群中,需要注意下,如果job中并行階段增多,那么集群利用率就會增加。建議在數(shù)據(jù)量大,sql很長的時候使用,數(shù)據(jù)量小,sql比較的小開啟有可能還不如之前快。

          優(yōu)化案例

          優(yōu)化前:

          實際生產(chǎn)中hive的應(yīng)用_實際生產(chǎn)中hive的應(yīng)用_實際生產(chǎn)中hive的應(yīng)用

          SET hive.exec.parallel=true; 

          優(yōu)化后:

          SET hive.exec.parallel=false; SET hive.exec.reducers.max=10;

          6. 數(shù)據(jù)傾斜

          任務(wù)進度長時間維持在99%(或100%),檢查任務(wù)監(jiān)控頁面后發(fā)現(xiàn)僅有少量(1個或幾個)reduce子任務(wù)未完成。這些未完成的reduce子任務(wù)由于處理的數(shù)據(jù)量與其他reduce子任務(wù)存在顯著差異。具體而言,單一reduce子任務(wù)的記錄數(shù)與平均記錄數(shù)之間存在顯著差異,通常可達到3倍甚至更多。此外,未完成的reduce子任務(wù)的最長時長明顯超過了平均時長。主要原因可以歸結(jié)為以下幾種:

          6.1 空值引發(fā)的數(shù)據(jù)傾斜

          在數(shù)據(jù)倉庫中存在大量空值(NULL)的情況下,導致數(shù)據(jù)分布不均勻的現(xiàn)象。這種數(shù)據(jù)傾斜可能會對數(shù)據(jù)分析和計算產(chǎn)生負面影響。當數(shù)據(jù)倉庫中某個字段存在大量空值時,這些空值會在數(shù)據(jù)計算和聚合操作中引起不平衡的情況。例如,在使用聚合函數(shù)(如SUM、COUNT、AVG等)對該字段進行計算時,空值并不會被包括在內(nèi),導致計算結(jié)果與實際情況不符。數(shù)據(jù)傾斜會導致部分reduce子任務(wù)負載過重,而其他reduce子任務(wù)負載較輕,從而影響任務(wù)的整體性能。這可能導致任務(wù)進度長時間維持在99%(或100%),但仍有少量reduce子任務(wù)未完成的情況。

          優(yōu)化方案

          第一種:可以直接不讓null值參與join操作,即不讓null值有shuffle階段。

          第二種:因為null值參與shuffle時的hash結(jié)果是一樣的,那么我們可以給null值隨機賦值,這樣它們的hash結(jié)果就不一樣,就會進到不同的reduce中。

          6.2 不同數(shù)據(jù)類型引發(fā)的數(shù)據(jù)傾斜

          在數(shù)據(jù)倉庫中,不同數(shù)據(jù)類型的字段可能具有不同的取值范圍和分布情況。例如,某個字段可能是枚舉類型,只有幾個固定的取值;而另一個字段可能是連續(xù)型數(shù)值,取值范圍較大。當進行數(shù)據(jù)計算和聚合操作時,如果不同數(shù)據(jù)類型的字段在數(shù)據(jù)分布上存在明顯的差異,就會導致數(shù)據(jù)傾斜。數(shù)據(jù)傾斜會導致部分reduce子任務(wù)負載過重,而其他reduce子任務(wù)負載較輕,從而影響任務(wù)的整體性能。這可能導致任務(wù)進度長時間維持在99%(或100%),但仍有少量reduce子任務(wù)未完成的情況。

          優(yōu)化方案

          如果key字段既有string類型也有int類型,默認的hash就都會按int類型來分配,那我們直接把int類型都轉(zhuǎn)為string就好了,這樣key字段都為string,hash時就按照string類型分配了。

          6.3 不可拆分大文件引發(fā)的數(shù)據(jù)傾斜

          在Hadoop分布式計算框架中,數(shù)據(jù)通常會被切分成多個數(shù)據(jù)塊進行并行處理。然而,當遇到一些無法被切分的大文件時,這些大文件會被作為一個整體分配給一個reduce任務(wù)進行處理,而其他reduce任務(wù)則可能得到較小的數(shù)據(jù)量。這導致部分reduce任務(wù)負載過重,而其他任務(wù)負載較輕,從而影響任務(wù)的整體性能。

          優(yōu)化方案

          這種數(shù)據(jù)傾斜問題沒有什么好的解決方案,只能將使用GZIP壓縮等不支持文件分割的文件轉(zhuǎn)為bzip和zip等支持文件分割的壓縮方式。

          所以,我們在對文件進行壓縮時,為避免因不可拆分大文件而引發(fā)數(shù)據(jù)讀取的傾斜,在數(shù)據(jù)壓縮的時候可以采用bzip2和Zip等支持文件分割的壓縮算法。

          6.4 數(shù)據(jù)膨脹引發(fā)的數(shù)據(jù)傾斜

          數(shù)據(jù)膨脹通常是由于某些數(shù)據(jù)在倉庫中存在大量冗余、重復或者拆分產(chǎn)生的。當這些數(shù)據(jù)被用于計算和聚合操作時,會導致部分reduce子任務(wù)負載過重,而其他reduce子任務(wù)負載較輕,從而影響任務(wù)的整體性能。

          優(yōu)化方案

          在Hive中可以通過參數(shù) hive.new.job..set. 配置的方式自動控制作業(yè)的拆解,該參數(shù)默認值是30。表示針對 sets/rollups/cubes這類多維聚合的操作,如果最后拆解的鍵組合大于該值,會啟用新的任務(wù)去處理大于該值之外的組合。如果在處理數(shù)據(jù)時,某個分組聚合的列有較大的傾斜,可以適當調(diào)小該值。

          6.5 表連接時引發(fā)的數(shù)據(jù)傾斜

          在數(shù)據(jù)倉庫中,表連接是常用的操作,用于將不同表中的數(shù)據(jù)進行關(guān)聯(lián)和合并。然而,當連接鍵在不同表中的數(shù)據(jù)分布不均勻時,就會導致連接結(jié)果中某些連接鍵對應(yīng)的數(shù)據(jù)量遠大于其他連接鍵的數(shù)據(jù)量。這會導致部分reduce任務(wù)負載過重,而其他任務(wù)負載較輕,從而影響任務(wù)的整體性能。

          優(yōu)化方案

          通常做法是將傾斜的數(shù)據(jù)存到分布式緩存中,分發(fā)到各個Map任務(wù)所在節(jié)點。在Map階段完成join操作,即MapJoin,這避免了 Shuffle,從而避免了數(shù)據(jù)傾斜。

          6.6 確實無法減少數(shù)據(jù)量引發(fā)的數(shù)據(jù)傾斜

          在某些情況下,數(shù)據(jù)的數(shù)量本身就非常龐大,例如某些業(yè)務(wù)場景中的大數(shù)據(jù)集,或者歷史數(shù)據(jù)的積累等。在這種情況下,即使采取了數(shù)據(jù)預處理、數(shù)據(jù)分區(qū)等措施,也無法減少數(shù)據(jù)的數(shù)量。

          優(yōu)化方案

          這類問題最直接的方式就是調(diào)整reduce所執(zhí)行的內(nèi)存大小。

          調(diào)整reduce的內(nèi)存大小使用.reduce.memory.mb這個配置。

          7. 合并小文件

          在HDFS中,每個小文件對象約占150字節(jié)的元數(shù)據(jù)空間,如果有大量的小文件存在,將會占用大量的內(nèi)存資源。這將嚴重限制節(jié)點的內(nèi)存容量,進而影響整個集群的擴展能力。從Hive的角度來看,小文件會導致產(chǎn)生大量的Map任務(wù),每個Map任務(wù)都需要啟動一個獨立的JVM來執(zhí)行。這些任務(wù)的初始化、啟動和執(zhí)行會消耗大量的計算資源,嚴重影響性能,因為每個小文件都需要進行一次磁盤IO操作。

          因此,我強烈建議避免使用包含大量小文件的數(shù)據(jù)源。相反,我們應(yīng)該進行小文件合并操作,以減少查詢過程中的磁盤IO次數(shù),從而提高查詢效率。通過合并小文件,我們可以將多個小文件合并成一個較大的文件,從而減少對磁盤的IO訪問次數(shù)。這樣可以降低系統(tǒng)資源的消耗,提高查詢性能。

          因此,在構(gòu)建數(shù)據(jù)倉庫時,應(yīng)該盡可能使用較大的文件來存儲數(shù)據(jù),避免大量小文件的產(chǎn)生。如果已經(jīng)存在大量小文件,可以考慮進行小文件合并操作,以優(yōu)化數(shù)據(jù)存儲和查詢性能。這樣可以提高Hive查詢的效率,減少資源的浪費,并保證系統(tǒng)的穩(wěn)定性和可擴展性。

          7.1 Hive引擎合并小文件參數(shù)

          --是否和并Map輸出文件,默認true

          set hive.merge.mapfiles = true;

          --是否合并 Reduce 輸出文件,默認false

          set hive.merge.mapredfiles = true;

          --合并文件的大小,默認字節(jié)

          set hive.merge.size.per.task = 256000000;

          --當輸出文件的平均大小小于該值時,啟動一個獨立的map-reduce任務(wù)進行文件merge,默認字節(jié)

          set hive.merge.smallfiles.avgsize = 256000000;

          7.2 Spark引擎合并小文件參數(shù),所以盡量將MR切換成Spark

          --是否合并小文件,默認true

          conf spark.sql.hive.mergeFiles=true;

          8. 結(jié)論

          本論文介紹了大數(shù)據(jù)從業(yè)者必備的Hive SQL調(diào)優(yōu)技巧,包括查詢優(yōu)化、數(shù)據(jù)分區(qū)和索引、數(shù)據(jù)加載和轉(zhuǎn)換等方面。通過深入理解Hive SQL語言和優(yōu)化策略,開發(fā)人員可以提升查詢效率和性能。通過優(yōu)化案例和優(yōu)化前后的SQL代碼,展示了每種優(yōu)化方案的實際應(yīng)用效果。

          附:實踐案例

          一、背景

          某公司的線上平臺每天產(chǎn)生大量的用戶數(shù)據(jù),包括用戶行為、訂單信息等。為了更好地分析用戶行為和業(yè)務(wù)趨勢,我們需要對數(shù)據(jù)進行復雜的查詢操作。原始的Hive SQL語句在執(zhí)行時存在性能瓶頸,因此我們決定對其進行優(yōu)化。

          二、原始SQL語句

          原始的Hive SQL語句如下:

          SELECT * FROM user_data WHERE user_id IN (SELECT user_id FROM order_data WHERE order_date >= '2022-01-01')

          這個查詢語句的目的是從表中選取所有在表中最近一個月有訂單的用戶數(shù)據(jù)。由于表和表的數(shù)據(jù)量都很大,這個查詢語句執(zhí)行時間較長,存在性能瓶頸。

          三、優(yōu)化策略

          針對原始SQL語句的性能瓶頸,我們采取了以下優(yōu)化策略:

          使用Spark計算引擎:Spark是一種高效的分布式計算框架,可以與Hive SQL集成使用來提高查詢效率。我們將使用Spark計算引擎來執(zhí)行查詢。

          使用JOIN操作:將兩個表通過JOIN操作連接起來,可以減少數(shù)據(jù)的傳輸和計算開銷。我們將使用JOIN操作來連接表和表。

          使用過濾條件:在查詢過程中,使用過濾條件可以減少數(shù)據(jù)的處理量。我們將使用過濾條件來篩選出符合條件的用戶數(shù)據(jù)。

          四、優(yōu)化后的SQL語句

          基于上述優(yōu)化策略,我們優(yōu)化后的Hive SQL語句如下:

          SELECT u.* FROM user_data u JOIN (SELECT user_id FROM order_data WHERE order_date >= '2022-01-01') o ON u.user_id = o.user_id

          這個查詢語句使用了JOIN操作將表和子查詢結(jié)果連接起來,并通過過濾條件篩選出符合條件的用戶數(shù)據(jù)。同時,我們使用了Spark計算引擎來執(zhí)行查詢。

          五、性能對比

          我們對優(yōu)化前后的SQL語句進行了性能對比。以下是性能對比的結(jié)果:

          執(zhí)行時間:優(yōu)化后的SQL語句執(zhí)行時間比原始SQL語句減少了約50%。

          數(shù)據(jù)傳輸量:優(yōu)化后的SQL語句減少了數(shù)據(jù)的傳輸量,提高了數(shù)據(jù)處理的效率。

          內(nèi)存消耗:優(yōu)化后的SQL語句使用了Spark計算引擎,可以更好地利用內(nèi)存資源,提高了查詢性能。

          通過對比可以看出,優(yōu)化后的SQL語句在執(zhí)行時間、數(shù)據(jù)傳輸量和內(nèi)存消耗等方面都取得了顯著的提升。

          數(shù)據(jù)庫建模三步驟:概念模型->邏輯模型->物理模型

          概念模型就是在了解了用戶的需求,用戶的業(yè)務(wù)領(lǐng)域工作情況以后,經(jīng)過分析和總結(jié),提煉出來的用以描述用戶業(yè)務(wù)需求的一些概念的東西。如銷售業(yè)務(wù)中的“客戶”和“定單”,還有就是“商品”,“業(yè)務(wù)員”。 用USE CASE來描述就是:“業(yè)務(wù)員”與“客戶”就購買“商品”之事簽定下“定單”。(此時可以不包含屬性,只有實體集,聯(lián)系集的分析結(jié)構(gòu))

          邏輯模型就是要將概念模型具體化。要實現(xiàn)概念模型所描述的東西,需要那些具體的功能和處理那些具體的信息。這就到了需求分析的細化階段。還以銷售業(yè)務(wù)為例:“客戶” 信息基本上要包括:單位名稱,聯(lián)系人,聯(lián)系電話,地址等屬性;“商品”信息基本上要包括:名稱,類型,規(guī)格,單價等屬性;“定單”信息基本上要包括:日期 和時間屬性。并且“定單”要與“客戶”,“業(yè)務(wù)員”和“商品”明細關(guān)聯(lián)。

          系統(tǒng)需要建立幾個數(shù)據(jù)表:業(yè)務(wù)員信息表,客戶信息表,商品信息表,定單表。

          系統(tǒng)要包括幾個功能:業(yè)務(wù)員信息維護,客戶信息維護,商品信息維護,建立銷售定單 。

          以上這些均屬于建立邏輯模型,這些說明只表明系統(tǒng)要實現(xiàn)什么,但怎樣實現(xiàn),用什么工具實現(xiàn)還沒有講,后者屬于物理模型范圍。

          物理模型就 是針對上述邏輯模型所說的內(nèi)容,在具體的物理介質(zhì)上實現(xiàn)出來。如:數(shù)據(jù)庫使用SQL Server 2000,這樣就可以編寫具體的SQL腳本在數(shù)據(jù)庫服務(wù)器上將數(shù)據(jù)庫建立起來。其中包括業(yè)務(wù)員信息表,客戶信息表,商品信息表,定單表。客戶端使用VS開 發(fā)工具,那么在工作站上用VS建立起功能菜單,包括:業(yè)務(wù)員信息維護,客戶信息維護,商品信息維護,建立銷售定單等功能,并用工具將每一個功能編碼實現(xiàn)。

          這三個過程,就是實現(xiàn)一個軟件系統(tǒng)的三個關(guān)鍵的步驟,是一個從抽象到具體的一個不斷細化完善的分析,設(shè)計和開發(fā)的過程。

          數(shù)據(jù)庫建模:在設(shè)計數(shù)據(jù)庫時,對現(xiàn)實世界進行分析、抽象、并從中找出內(nèi)在聯(lián)系,進而確定數(shù)據(jù)庫的結(jié)構(gòu),這一過程就稱為數(shù)據(jù)庫建模。它主要包括兩部分內(nèi)容:確定最基本的數(shù)據(jù)結(jié)構(gòu);對約束建模。

          1.概念模型的表示方法

          E-R圖主要是由實體、屬性和聯(lián)系三個要素構(gòu)成的。在E-R圖中,使用了下面四種基本的圖形符號。

          2.確定系統(tǒng)實體、屬性及聯(lián)系

          系統(tǒng)分析階段建立數(shù)據(jù)字典和數(shù)據(jù)流程圖->建立概念模型->邏輯模型->物理模型

          利用系統(tǒng)分析階段建立的數(shù)據(jù)字典,并對照數(shù)據(jù)流程圖對系統(tǒng)中的各個數(shù)據(jù)項進行分類、組織,確定系統(tǒng)中的實體、實體的屬性、標識實體的碼以及實體之間聯(lián)系的類型。

          在數(shù)據(jù)字典中“數(shù)據(jù)項”是基本數(shù)據(jù)單位,一般可以作為實體的屬性。“數(shù)據(jù)結(jié)構(gòu)”、“數(shù)據(jù)存儲”和“數(shù)據(jù)流”條目都可以作為實體,因為它們總是包含了若干的數(shù)據(jù)項。作為屬性必須是不可再分的數(shù)據(jù)項,也就是說在屬性中不能包含其他的屬性。

          3.確定局部(分)E-R圖

          庫步驟數(shù)據(jù)設(shè)計有什么作用_數(shù)據(jù)庫設(shè)計有哪些步驟_設(shè)計數(shù)據(jù)庫的步驟

          根據(jù)上面的分析,可以畫出部分實體-聯(lián)系圖。

          在這些實體中有下畫線的屬性可以作為實體的碼,這幾個實體之間存在著1:1、l:n和m:n幾種聯(lián)系。

          4.集成完整(總)E-R圖

          各個局部(分)E-R圖畫好以后,應(yīng)當將它們合并起來集成為完整(總)E-R圖。在集成時應(yīng)當注意如下幾點:

          (1)消除不必要的冗余實體、屬性和聯(lián)系。

          (2)解決各分E-R圖之間的沖突。

          (3)根據(jù)情況修改或重構(gòu)E-R圖。

          6.2.3邏輯結(jié)構(gòu)設(shè)計

          邏輯結(jié)構(gòu)設(shè)計的任務(wù),就是把概念結(jié)構(gòu)設(shè)計階段建立的基本E-R圖,按選定的管理系統(tǒng)軟件支持的數(shù)據(jù)模型(層次、網(wǎng)狀、關(guān)系),轉(zhuǎn)換成相應(yīng)的邏輯模型。這種轉(zhuǎn)換要符合關(guān)系數(shù)據(jù)模型的原則。

          E-R圖向關(guān)系模型的轉(zhuǎn)換是要解決如何將實體和實體間的聯(lián)系轉(zhuǎn)換為關(guān)系,并確定這些關(guān)系的屬性和碼。這種轉(zhuǎn)換一般按下面的原則進行:

          (1)一個實體轉(zhuǎn)換為一個關(guān)系,實體的屬性就是關(guān)系的屬性,實體的碼就是關(guān)系的碼。

          (2)一個聯(lián)系也轉(zhuǎn)換為一個關(guān)系,聯(lián)系的屬性及聯(lián)系所連接的實體的碼都轉(zhuǎn)換為關(guān)系的屬性,但是關(guān)系的碼會根據(jù)聯(lián)系的類型變化,如果是:

          1:1聯(lián)系,兩端實體的碼都成為關(guān)系的候選碼。

          1:n聯(lián)系,n端實體的碼成為關(guān)系的碼。

          m:n聯(lián)系,兩端實體碼的組合成為關(guān)系的碼。

          總結(jié):

          庫步驟數(shù)據(jù)設(shè)計有什么作用_設(shè)計數(shù)據(jù)庫的步驟_數(shù)據(jù)庫設(shè)計有哪些步驟

          概念數(shù)據(jù)模型設(shè)計與邏輯數(shù)據(jù)模型設(shè)計、物理數(shù)據(jù)模型設(shè)計是數(shù)據(jù)庫及數(shù)據(jù)倉庫模型設(shè)計的三個主要步驟。

          在數(shù)據(jù)倉庫領(lǐng)域有一個概念叫,中文一般翻譯為“概念數(shù)據(jù)模型”。

          概念數(shù)據(jù)模型是最終用戶對數(shù)據(jù)存儲的看法,反映了最終用戶綜合性的信息需求,它以數(shù)據(jù)類的方式描述企業(yè)級的數(shù)據(jù)需求,數(shù)據(jù)類代表了在業(yè)務(wù)環(huán)境中自然聚集成的幾個主要類別數(shù)據(jù)。

          概念數(shù)據(jù)模型的內(nèi)容包括重要的實體及實體之間的關(guān)系。在概念數(shù)據(jù)模型中不包括實體的屬性,也不用定義實體的主鍵。這是概念數(shù)據(jù)模型和邏輯數(shù)據(jù)模型的主要區(qū)別。

          概念數(shù)據(jù)模型的目標是統(tǒng)一業(yè)務(wù)概念,作為業(yè)務(wù)人員和技術(shù)人員之間溝通的橋梁,確定不同實體之間的最高層次的關(guān)系。

          在有些數(shù)據(jù)模型的設(shè)計過程中,概念數(shù)據(jù)模型是和邏輯數(shù)據(jù)模型合在一起進行設(shè)計的。

          在數(shù)據(jù)倉庫領(lǐng)域有一個概念叫,中文一般翻譯為“邏輯數(shù)據(jù)模型”。

          邏輯數(shù)據(jù)模型反映的是系統(tǒng)分析設(shè)計人員對數(shù)據(jù)存儲的觀點,是對概念數(shù)據(jù)模型進一步的分解和細化。邏輯數(shù)據(jù)模型是根據(jù)業(yè)務(wù)規(guī)則確定的,關(guān)于業(yè)務(wù)對象、業(yè)務(wù)對象的數(shù)據(jù)項及業(yè)務(wù)對象之間關(guān)系的基本藍圖。

          邏輯數(shù)據(jù)模型的內(nèi)容包括所有的實體和關(guān)系,確定每個實體的屬性,定義每個實體的主鍵,指定實體的外鍵,需要進行范式化處理。

          邏輯數(shù)據(jù)模型的目標是盡可能詳細的描述數(shù)據(jù),但并不考慮數(shù)據(jù)在物理上如何來實現(xiàn)。

          邏輯數(shù)據(jù)建模不僅會影響數(shù)據(jù)庫設(shè)計的方向,還間接影響最終數(shù)據(jù)庫的性能和管理。如果在實現(xiàn)邏輯數(shù)據(jù)模型時投入得足夠多,那么在物理數(shù)據(jù)模型設(shè)計時就可以有許多可供選擇的方法。

          在數(shù)據(jù)倉庫領(lǐng)域有一個概念叫,中文一般翻譯為“物理數(shù)據(jù)模型”。

          物理數(shù)據(jù)模型是在邏輯數(shù)據(jù)模型的基礎(chǔ)上,考慮各種具體的技術(shù)實現(xiàn)因素,進行數(shù)據(jù)庫體系結(jié)構(gòu)設(shè)計,真正實現(xiàn)數(shù)據(jù)在數(shù)據(jù)庫中的存放。

          物理數(shù)據(jù)模型的內(nèi)容包括確定所有的表和列,定義外鍵用于確定表之間的關(guān)系,基于用戶的需求可能進行發(fā)范式化等內(nèi)容。在物理實現(xiàn)上的考慮,可能會導致物理數(shù)據(jù)模型和邏輯數(shù)據(jù)模型有較大的不同。

          物理數(shù)據(jù)模型的目標是指定如何用數(shù)據(jù)庫模式來實現(xiàn)邏輯數(shù)據(jù)模型,以及真正的保存數(shù)據(jù)。


          主站蜘蛛池模板: 国产伦精品一区二区三区不卡 | 免费看AV毛片一区二区三区| 夜夜爽一区二区三区精品| 久久亚洲综合色一区二区三区| 亚洲一区精彩视频| 国产成人精品无码一区二区三区| 日本精品一区二区三区四区| 一区二区三区在线观看| 亚洲视频一区二区三区| 亚洲爆乳精品无码一区二区三区 | 亚洲第一区精品观看| 人妻视频一区二区三区免费| 亚洲福利一区二区三区| 亚洲AV色香蕉一区二区| 日本内射精品一区二区视频 | 亚洲日韩一区二区一无码| 亚洲国产一区在线观看| 亚洲福利一区二区精品秒拍| 3d动漫精品啪啪一区二区免费| 国产剧情国产精品一区| 另类免费视频一区二区在线观看| 国产在线精品一区二区不卡麻豆| 精品国产AⅤ一区二区三区4区| 亚洲AⅤ无码一区二区三区在线| 内射一区二区精品视频在线观看| 国产亚洲综合精品一区二区三区| 国内精品视频一区二区三区八戒 | 无码精品人妻一区二区三区免费看| 亚洲一区二区三区自拍公司| 亚洲国产精品乱码一区二区| 亚欧在线精品免费观看一区| 99久久精品日本一区二区免费 | 久久久久成人精品一区二区| 亚洲一区综合在线播放| 亚洲综合一区二区三区四区五区 | 无码精品黑人一区二区三区| 精品一区二区三区无码免费视频| 波多野结衣一区视频在线| 在线免费视频一区| 农村人乱弄一区二区| 极品人妻少妇一区二区三区 |