溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Apache Hive中的使用技巧有哪些

發(fā)布時間:2021-12-10 14:41:19 來源:億速云 閱讀:360 作者:小新 欄目:大數(shù)據(jù)

這篇文章給大家分享的是有關(guān)Apache Hive中的使用技巧有哪些的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

1、不要使用 MapReduce

不管你是不是覺得 Tez、Spark 或 Impala 能行,但是不要指望 MapReduce。它本身就很慢,比 Hive 還慢。如果你用的是  Hortonwork 的版本,你可以在腳本前面寫上 set hive.execution.engine=tez ;用 Cloudera 的話,使用  Impala。如果 Impala 不適用的話,我 希望到時候 可以使用 hive.execution.engine=spark 。

2、不要在 SQL 中做字符串匹配

絕不要,特別是在 Hive 中!如果你堅持要在 WHERE 語句中使用 LIKE  匹配,就會產(chǎn)生一個跨產(chǎn)品的警告。本來你的查詢可能只用幾秒鐘,但是使用字符串匹配的話就會變成幾分鐘。***的辦法是使用那些可以在 Hadoop  中進行搜索的工具,可以試試 Elasticsearch 的 Hive 集成版本或 Lucidwork 的 Solr ,以及 Cloudera Search  。關(guān)系型數(shù)據(jù)庫這方面表現(xiàn)并不好,但是 Hive 則更糟糕。

3、不要用表連接子查詢

你***創(chuàng)建一個臨時表,然后對這個臨時表進行連接,而不是讓 Hive 自己智能處理子查詢。即不要這樣做:

select a.* from something a inner join    (select ... from somethingelse union b select ... from anotherthing c) d    on a.key1 = d.key1 and a.key2 = b.key2 where a.condition=1

而是應(yīng)該這樣:

create var_temp as select ... from somethingelse b    union select ... from anotherthing c  and then  select a.* from something a inner join from var_temp b    where a.key1=b.key1 and a.key2=b.key2 where a.condition=1

一般來說,這會比 Hive 自己處理子查詢要快許多。

4、使用 Parquet 或 ORC,但是不要轉(zhuǎn)換使用

也就是說,使用 Parquet 或 ORC 而不要用  TEXTFILE。然而,如果你要把文本數(shù)據(jù)中導(dǎo)入到更具結(jié)構(gòu)性的數(shù)據(jù)中,應(yīng)該做一些轉(zhuǎn)換再導(dǎo)入到目標(biāo)表中。你不應(yīng)該用 LOAD DATA 將文本文件加載到 ORC  中,而是應(yīng)該將其加載到一個文本中。

如果你要創(chuàng)建另外一個表,并最終大多數(shù)分析都是對它進行的,那么你就該對該表進行 ORC 化,因為轉(zhuǎn)換到 ORC 或 Parquet  要花費很多時間,并不值得將其放到你的 ETL 處理中。如果你有一個簡單的普通文本要導(dǎo)入,也沒做過任何優(yōu)化,你應(yīng)該將其加載到一個臨時表并通過 select  create 放到 ORC 或 Parquet 中。不過,這有點慢。

5、開關(guān)矢量化試試

在你的腳本前面加上 set hive.vectorized.execution.enabled = true 和 set  hive.vectorized.execution.reduce.enabled = true ,然后試著打開或關(guān)閉它們看看。因為最近版本的 Hive  的矢量化有點問題。

6、不要在表連接中使用 structs

我必須承認(rèn)我大腦里面的 SQL 格式還是 SQL-92 時代的,所以我無論如何都不會想到去用 structs  。但是如果你做一些超級復(fù)雜的操作,比如在聯(lián)合主鍵上使用 ON 語句,那么 structs 就很方便。不幸的是,Hive 對它們很不適應(yīng),特別是在 ON  語句上。當(dāng)然,大多數(shù)情況下,在較小的數(shù)據(jù)集和 yields 下是沒錯誤的。在 Tez  里面,你會得到一個有趣的矢量錯誤。這個限制并未見于我所知的任何文檔,也許這是一個探索你的執(zhí)行引擎內(nèi)部的好辦法。

7、檢查你的容器大小

你也許需要為 Impala 或 Tez 增加你的容器大小。如果有你的節(jié)點大小比較大,“推薦的”容器大小可能就不適用于你的系統(tǒng)。你也許需要確保你的 YARN  隊列和常規(guī)的 YARN 內(nèi)存大小合適。你也許應(yīng)該 注意默認(rèn)的隊列并不適合 所有的常規(guī)使用。

8、啟用統(tǒng)計

Hive 在表連接時 會做一些蠢事 ,除非 啟用了統(tǒng)計 。你也可以 在 Impala 中使用查詢提示 。

9、考慮 MapJoin 優(yōu)化

如果你分析你的查詢,你可能發(fā)現(xiàn)***的 Hive 已經(jīng)可以足夠智能地進行自動優(yōu)化了。但是你也許需要再調(diào)整一下。

10、如果可以, 將大表放到***

如標(biāo)題。

11、分區(qū)總會幫到你,不管多少

如果你有一個出現(xiàn)在許多地方的東西,比如語句中的日期(但不是日期范圍)或重復(fù)的地點,你也許應(yīng)該做分區(qū)。分區(qū)的基本意思是“拆分到它自己的目錄里面”,而不是到一個大的文件中去查找。當(dāng)你在你的  join/where 語句中僅檢索 location=’NC’ 這樣一個小數(shù)據(jù)集時,Hive 就可以在一個文件中查找。此外,和列值不同,你可以在你的 LOAD  DATA 語句中加上分區(qū)。另外,要記住, HDFS 并不喜歡小文件 。

12、使用哈希進行列比較

如果你要在每個查詢中比較同樣的10個字段,可以考慮使用 hash() 來比較它們的校驗值。在一個輸出表中展示它們也許很有用。注意,在 Hive 0.12  中,哈希功能比較差,0.13中的哈希更好一些。

感謝各位的閱讀!關(guān)于“Apache Hive中的使用技巧有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI