注意:在資料量很大的情況下,先使用group by去重再count()計數,效率要高於count(distinct *)
1、grouping sets():在group by查詢中,根據不同的維度組合進行聚合,等價於
將不同維度的group by結果集進行union all。聚合規則在括號中進行指定。
注意:聚合結果均在同一列,分類欄位用不同列來進行區分
--性別、城市、等級使用者分布--
select ***,
city,
level
,count
(distinct user_id)
from user_info
group
by ***,city,
level
grouping sets (***,city,
level
);
2、cube:根據group by 維度的所有組合進行聚合
--性別、城市、等級的各種組合的使用者分布--
select ***,
city,
level
,count
(distinct user_id)
from user_info
group
by ***,city,
level
with cube;
3、rollup:以最左側的維度為主,進行層級聚合,是cube的子集。
select
year
(dt)
asyear
,month
(dt)
asmonth
,sum
(pay_amount)
from user_trade
where dt>
'0'group
byyear
(dt)
,month
(dt)
with rollup
;
引數設定:set hive.exec.parallel=true
可以並行的任務較多時,開啟併發執行,可以提高執行效率。
user_goods_category 列名
舉例user_name
使用者名稱category_detail
使用者購買過的品類列表,用逗號進行分割
--每個品類的購買使用者數--
select b.category,
count
(distinct a.user_name)
from user_goods_category a
lateral view explode(split(category_detail,
',')
)b as category
group
by b.category;
split():字串分割函式
explode:行轉列函式
小表在前,大表在後
hive假定查詢中最後的乙個表是大表,它會將其它表快取起來,然後掃瞄
最後那個表。
使用相同的連線鍵
當對3個或者更多個表進行join連線時,如果每個on子句都使用相同的連線
鍵的話,那麼只會產生乙個mapreduce job。
盡早的過濾資料
減少每個階段的資料量,對於分割槽表要加分割槽,同時只選擇需要使用到的
字段。邏輯過於複雜時,引入中間表
資料傾斜的表現:
任務進度長時間維持在99%(或100%),檢視任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。因為其處理的資料量和其他reduce差異過大。
資料傾斜的原因與解決辦法:
1、空值產生的資料傾斜
解決:如果兩個表連線時,使用的連線條件有很多空值,建議在連線條件中增加過濾
例如:on a.user_id=b.user_id and a.user_id is not null
2、大小表連線(其中一張表很大,另一張表非常小)
解決:將小表放到記憶體裡,在map端做join
3、兩個表連線條件的字段資料型別不一致
解決:將連線條件的字段資料型別轉換成一致的
例如:on a.user_id=cast(b.user_id as string)
Hive之企業級引數優化
3.使用vectorization vectorized查詢執行會提高操作效能,例如scans aggregations filters和joins,通過一次執行1024行提高效能。該屬性在hive 0.13版本引入,該屬性能夠提高查詢執行的時間。通過設定以下兩個引數 code language s...
Hive企業級調優
對sql語句的優化 統計個數使用count 1 不要使用count 查詢字段不要select 使用select 字段 使用特殊的儲存格式 列式儲存 orc,parquet 建表的時候 stored as orc 小表join大表 mr程式中的map端 jojn 小表是個小檔案可以分布式的快取到集群的...
Hive企業級調優(五)
推測執行 在分布式集群環境下,因為程式bug 包括hadoop本身的bug 負載不均衡或者資源分布不均等原因,會造成同乙個作業的多個任務之間執行速度不一致,有些任務的執行速度可能明顯慢於其他任務 比如乙個作業的某個任務進度只有50 而其他所有任務已經執行完畢 則這些任務會拖慢作業的整體執行進度。為了...