《Hive編程指南學習》:HQL基礎、HQL優化


Hive優化爲文中標黃的內容。

1 HQL數據定義

//數據庫中,表名,正則表達式
use jmw;
show tables like “jm.*”;

//簡單查詢
select distinct gender
from jmw.jm_ti_account
where ymd>“20191230”
limit 10

//創建表
create table if not exists jmw.stephenTest(
name string comment “person’s name”,
age int comment “person’s age”,
sex int comment “person’s sex”
)
comment “stephen’s test”
tblproperties(‘creator’=‘me’,‘created_at’ = ‘2020-03-13 10:22:00’)
location “hdfs://nameservice1/user/hive/warehouse/jmw.db”

//展示表的表結構,即大致信息
describe jmw.jm_ti_account;

//展示表的詳細表結構信息
describe extended jmw.jm_ti_account;

//展示更加冗長的、可讀的表結構信息
describe formatted jmw.jm_ti_account;

//展示表的所有分區
show partitions jmw.jm_ti_account;

//查詢是否存在某個分區鍵的分區
show partitions jmw.jm_ti_account partition(ymd=‘20191016’);

//加載數據,並創建分區
load data local inpath’${env:home}/…’
into table xxx
partition(country=’’,state=’’);

overwrite:使用該關鍵字時,目標文件夾中之前存在的數據會被刪除掉。
如果沒有該關鍵字,僅僅會把新增的文件增加到文件夾中,如果已存在同名文件,會將新文件重命名爲文件名_序列號。

2 HQL數據操作

//裝載數據
load data local inpath’${env:home}/…’
into table xxx
partition(country=’’,state=’’);

//裝載數據,將之前的數據刪除掉,再裝載
load data local inpath’${env:home}/…’
overwrite into table xxx
partition(country=’’,state=’’);

//通過查詢語句向表中插入數據
Insert overwrite table xxx1 partition(country=‘c1’,state=‘s1’)
select* from xxx2 where country=‘c1’ and state=’s1’

//需要創建的分區有點多時
From xxx2
Insert overwrite table xxx1
partition(country=‘c1’,state=‘s1’)
select * from xxx2 where country=‘c1’ and state=‘s1’
Insert overwrite table xxx1
partition(country=‘c2’,state=‘s2’)
select * from xxx2 where country=‘c2’ and state=‘s2’
Insert overwrite table xxx1
partition(country=‘c2’,state=‘s2’)
select * from xxx2 where country=‘c2’ and state=‘s2’

//動態分區:需要創建的分區非常多時
Insert overwrite table xxx1
partition(country,state) //此處沒有指定需要創建的分區的,具體的值,所以這裏是動態分區。
select … ,alias.country,alias.state //注意給xxx2起了別名,爲了強調原表字段值和輸出分區值之間的關係是根據位置而不是命名來匹配的
From xxx2 alias

//混合使用靜態和動態分區
Insert overwrite table xxx1
partition(country=’Ch’,state)//注意,靜態分區必須在動態分區之前
select ….,alias.country,alias.state
from xxx2 alias
where xxx2.country = ‘Ch’

注意:有很多相關屬性限制資源利用。
hive.exec.dynamic.partition:開啓動態分區功能。
hive.exec.dynamic.partition.mode:允許所有分區都是動態的。
hive.exec.max.dynamic.partitions.pernode:每個mapper或reducer可以創建的最大分區個數。
hive.exec.max.dynamic.partitions:一個動態分區創建語句可以創建的最大分區個數。
hive.exec.max.created.files:全局可以創建的最大文件個數。

//單個查詢語句中創建表並加載數據
Create table xxx
as select語句

//導出數據

3 HQL查詢

3.1 select

HQL函數
upper(字符串):將字符串轉換爲大寫。
round(浮點數):將浮點數取整。

1 數學函數
Round
Floor
Ceil
Exp
Log
Pow
sqrt
Bin
Hex
Unhex
Conv
Abs
Pmod
Sin
Asin
Cos
Acos
tan
Atan
Degress
Radians
Positive
Negative
Sign
e()
pi()

2 聚合函數
count
sum
Avg
Min
Max
variance
var_pop
var_samp
stddev_pop
stddev_samp
covar_pop
covar_samp

優化
set hive.map.aggr = true
這個設置可以將頂層的聚合操作放在Map階段執行,從而減輕清洗階段數據傳輸和Reduce階段的執行時間,提升總體性能。
缺點:該設置會消耗更多的內存。
注:頂層的聚合操作(top-levelaggregation operation),是指在group by語句之前執行的聚合操作。例如:

hive> SET hive.map.aggr=true;
hive> SELECT count(*), avg(salary)FROM employees group by xxx having max()>1

3 表生成函數
Explod
json_tuple = get_json_object

4 其他內置函數 P88***,這就是需要學習的呀!!!
Cast:轉換類型。
Concat:連接字符串
concat_ws:連接字符串,並制定分隔符。

3.2 where

Like和RLike
Like:字符串的開頭、結尾,指定的子字符串,子字符串出現在字符串內的任何位置時。
RLike:可以使用Java的正則表達式。

3.3 什麼情況下Hive可以避免進行MapReduce?

優化
Hive對某些情況下的查詢可以不觸發MapReduce任務,即本地模式。
(1) select* from employee
這種情況下,Hive可以直接讀取employee目錄下的文件,格式化後輸出到控制檯。
(2) where 後的過濾條件全是分區字段,無論是否使用limit。
無需建立MapReduce,直接讀取。
(3) set hive.exec.mode.local.auto = true ,設置該參數後,Hive會嘗試使用本地模式執行其他操作,否則Hive使用MapReduce執行其他所有查詢。

四、優化
4.1 Join優化
大多數情況下,Hive會對每對join連接對象啓動一個MapReduce任務。
例如a join b on a.x = b.y and b join c on b.p = c.q,這時會啓動兩個MapReduce任務,先對a join b啓動一個,輸出的結果再與join c啓動一個MR任務。

優化:但是,當對多個表進行join連接時,如果每個on字句都使用同一個連接鍵(例如都使用UserID),那麼只會產生一個MapReduce Job。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章