大資料 hive 常見問題及解決方案

2021-08-14 21:40:05 字數 3123 閱讀 2972

資料傾斜

/display/

hive/languagemanual+ddl

#languagemanualddl-skewedtables

2、示例一:

create

table list_bucket_single (key string, value string)

skewed by (key) on (1,5,6) [stored as directories];

stored as directories:是否為這些指定的值建立子目錄

3、示例二:

create

table list_bucket_multiple (col1 string, col2 int, col3 string)

skewed by (col1, col2) on (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [stored as directories];

4、如果建立表的時候沒有指定,可以使用alter進行修改
1、調整reduce個數

set hive.exec.reducers.max=2000;

set mapred.reduce.tasks= 2000;

---增大reduce個數

2、join過程傾斜

set hive.skewjoin.key=1000000;

--這個是join的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體資料量設定

set hive.optimize.skewjoin=true;

--如果是join 過程出現傾斜 應該設定為true

3、group過程傾斜

set hive.groupby.mapaggr.checkinterval=1000000 ;

--這個是group的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體資料量設定

set hive.groupby.skewindata=true;

--如果是group by過程出現傾斜 應該設定為true

函式使用細節

hive調優

1、參考一:

2、參考二:

2、盡量盡早地過濾資料,減少每個階段的資料量,對於分割槽表要加分割槽,同時只選擇需要使用到的字段

select... from a

joinb on a.key= b.key

where a.userid>10

and b.userid<10

and a.dt='20120417'

and b.dt='20120417';

應該改寫為:

select.... from (select .... from a where dt='201200417'

and userid>10) a join

(select .... from b where dt='201200417'

and userid <10)b on (a.key= b.key);

原因是因為join發生在where之前,對應join是需要過濾的條件應該寫在on中

3、臨時表

3.1、如果一張表有多個字段,但是join只用到一小部分字段,且這張表要經常用到,將這些字段提取出來生成乙個張臨時表去join,可以減少大大減少該錶掃瞄時間

3.2、如果不想用上訴一樣生成內部表,乙個session之後就不需要中間表的時候,可以使用create

temporary

table table_name_here (key string, value string)建立臨時表,session結束後自動刪除

4、小表放左邊,因為每個map操作會把左表資料放入記憶體,然後將右表資料一條條讀取與左表關聯,這樣可以減少磁碟和記憶體的使用。

小表的定義:資料條數少,資料占用空間少。

如果一條sql同時要join多張表,那麼把資料占用空間少的表放最後join,這樣可以避免占用空間大的表在中間落盤過程中占用太大磁碟空間。

5、order

by最終所有的資料會彙總到乙個reducer上進行排序,可能使得該reducer壓力非常大,任務長時間無法完成。(預設一般強制帶上limit限定數目才能執行,限定數目排序的更快)

如果排序只要求保證value有序而key可以無序,例如要統計每個使用者每筆的交易額從高到低排列,只需要對每個使用者的交易額排序,而使用者id本身不需要排序。這種情況採用分片排序更好,語法類似於:

select user_id, amount from table distribute by user_id sort by user_id, amount

這裡用到的不是order

by,而是distribute by和sort by,distribute by標識map輸出時分發的key。

這樣最後排序的時候,相同的user_id和amount在同乙個reducer上被排序,不同的user_id可以同時分別在多個reducer上排序,相比order

by只能在乙個reducer上排序,速度有成倍的提公升。

rcfile等檔案格式的特性

.com/articles/ynfqn2

獲取最後乙個parition

latest_user_relation_dt=$($hive_bin

-s-e

"show partitions feature_offline_relation"

| awk -f

'=''end '

| awk -f

'/''')

資料hive常見問題

1.mysql 匯入時問題轉碼,避免亂碼 mysql源有各種字符集 字元轉換 convert convert fieldname using binary using gbk as fieldname 防止換行 trim replace replace replace fieldname r n r...

vs qt qgis環境搭建常見問題及解決方案

1.warning c4003 max 巨集的實參不足 解決方案 屬性 c c 預處理器 預處理器定義,加上nominmax即可 警告 c4819 該檔案包含不能在當前 頁 936 中表示的字元。請將該檔案儲存為 unicode 格式以防止資料丟失 1 找出警告的檔案,然後在該檔案的開始處加入下面的...

hive常見問題

distinct用法 對select 後面所有欄位去重,並不能只對一列去重 1 當distinct應用到多個欄位的時候,distinct必須放在開頭,其應用的範圍是其後面的所有字段,而不只是緊挨著它的乙個字段,而且distinct只能放到所有欄位的前面 2 distinct對null是不進行過濾的,...