Hive內(nèi)部函數(shù)簡(jiǎn)介及查詢語(yǔ)法

1.Hive內(nèi)置函數(shù):

在Hive中 系統(tǒng)給我們內(nèi)置了很多函數(shù) 具體參考官方地址

  • 看下官網(wǎng)給我們的介紹:
SHOW FUNCTIONS; --查看所有內(nèi)置函數(shù)
DESCRIBE FUNCTION <function_name>; --查看某個(gè)函數(shù)的描述
DESCRIBE FUNCTION EXTENDED <function_name>; --查看某個(gè)函數(shù)的具體使用方法
hive> DESCRIBE FUNCTION case;
OK
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END - When a = b, returns c; when a = d, return e; else return f
Time taken: 0.006 seconds, Fetched: 1 row(s)
hive> DESCRIBE FUNCTION EXTENDED case;
OK
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END - When a = b, returns c; when a = d, return e; else return f
Example:
 SELECT
 CASE deptno
   WHEN 1 THEN Engineering
   WHEN 2 THEN Finance
   ELSE admin
 END,
 CASE zone
   WHEN 7 THEN Americas
   ELSE Asia-Pac
 END
 FROM emp_details
Time taken: 0.008 seconds, Fetched: 13 row(s)
# DESCRIBE 可簡(jiǎn)寫為desc
hive> desc FUNCTION EXTENDED case;
OK
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END - When a = b, returns c; when a = d, return e; else return f
Example:
 SELECT
 CASE deptno
   WHEN 1 THEN Engineering
   WHEN 2 THEN Finance
   ELSE admin
 END,
 CASE zone
   WHEN 7 THEN Americas
   ELSE Asia-Pac
 END
 FROM emp_details
Time taken: 0.009 seconds, Fetched: 13 row(s)

下面我們了解下常用函數(shù)的使用方法:

# 為了方便測(cè)試 我們創(chuàng)建常用的dual表
hive> create table dual(x string);
OK
Time taken: 0.11 seconds
hive> insert into table dual values('');
Query ID = hadoop_20180702100505_f0566585-06b2-4c53-910a-b6a58791fc2d
Total jobs = 3
Launching Job 1 out of 3
...
OK
Time taken: 29.535 seconds
hive> select * from dual;
OK

Time taken: 0.147 seconds, Fetched: 1 row(s)
# 測(cè)試當(dāng)前時(shí)間
hive> select current_date from dual;
OK
2018-07-02
Time taken: 0.111 seconds, Fetched: 1 row(s)
# 測(cè)試當(dāng)前時(shí)間戳
hive> select current_timestamp from dual;
OK
2018-07-02 15:03:28.919
Time taken: 0.117 seconds, Fetched: 1 row(s)
# 測(cè)試substr函數(shù) 用于截取字符串
hive> desc function extended substr;
OK
substr(str, pos[, len]) - returns the substring of str that starts at pos and is of length len orsubstr(bin, pos[, len]) - returns the slice of byte array that starts at pos and is of length len
Synonyms: substring
pos is a 1-based index. If pos<0 the starting position is determined by counting backwards from the end of str.
Example:
   > SELECT substr('Facebook', 5) FROM src LIMIT 1;
  'book'
  > SELECT substr('Facebook', -5) FROM src LIMIT 1;
  'ebook'
  > SELECT substr('Facebook', 5, 1) FROM src LIMIT 1;
  'b'
Time taken: 0.016 seconds, Fetched: 10 row(s)
hive> SELECT substr('helloworld',-5) FROM dual;
OK
world
Time taken: 0.171 seconds, Fetched: 1 row(s)
hive> SELECT substr('helloworld',5) FROM dual;
OK
oworld
Time taken: 0.12 seconds, Fetched: 1 row(s)
hive> SELECT substr('helloworld',5,3) FROM dual;
OK
owo
Time taken: 0.142 seconds, Fetched: 1 row(s)
# 測(cè)試函數(shù)concat 用于將字符連接起來(lái)
hive> desc function extended concat_ws;
OK
concat_ws(separator, [string | array(string)]+) - returns the concatenation of the strings separated by the separator.
Example:
  > SELECT concat_ws('.', 'www', array('facebook', 'com')) FROM src LIMIT 1;
  'www.facebook.com'
Time taken: 0.019 seconds, Fetched: 4 row(s)
hive> select concat_ws(".","192","168","199","151") from dual;
OK
192.168.199.151
Time taken: 0.152 seconds, Fetched: 1 row(s)
# 測(cè)試函數(shù)split 用于拆分
hive> desc function extended split;
OK
split(str, regex) - Splits str around occurances that match regex
Example:
  > SELECT split('oneAtwoBthreeC', '[ABC]') FROM src LIMIT 1;
  ["one", "two", "three"]
Time taken: 0.021 seconds, Fetched: 4 row(s)
hive> select split("192.168.199.151","\\.") from dual;
OK
["192","168","199","151"]
Time taken: 0.169 seconds, Fetched: 1 row(s)
2.Hive查詢語(yǔ)法:
  • 簡(jiǎn)單select語(yǔ)法:
# 簡(jiǎn)單select語(yǔ)法
hive> select * from emp where deptno=10;
OK
7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10
Time taken: 0.899 seconds, Fetched: 3 row(s)
hive> select * from emp where empno <= 7800;
OK
7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30
7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
7788    SCOTT   ANALYST 7566    1987-4-19       3000.0  NULL    20
Time taken: 0.277 seconds, Fetched: 8 row(s)
hive> select * from emp where salary between 1000 and 1500;
OK
7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30
7876    ADAMS   CLERK   7788    1987-5-23       1100.0  NULL    20
7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10
Time taken: 0.187 seconds, Fetched: 5 row(s)
hive> select * from emp limit 5;
OK
7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
Time taken: 0.154 seconds, Fetched: 5 row(s)
hive> select * from emp where empno in(7566,7499);
OK
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20
Time taken: 0.153 seconds, Fetched: 2 row(s)
hive> select * from emp where comm is not null;
OK
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30
Time taken: 0.291 seconds, Fetched: 4 row(s)
  • 聚合函數(shù)及分組函數(shù):
# 聚合函數(shù)及分組函數(shù)
#  max/min/count/sum/avg 特點(diǎn):多進(jìn)一出,進(jìn)來(lái)很多條記錄出去只有一條記錄

# 查詢部門編號(hào)為10的有多少條記錄
hive> select count(1) from emp where deptno=10;
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
3
Time taken: 38.951 seconds, Fetched: 1 row(s)
# 求最大工資,最小工資滑黔,平均工資谤草,工資的和
hive> select max(salary),min(salary),avg(salary),sum(salary) from emp;
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
5000.0  800.0   2073.214285714286       29025.0
Time taken: 23.748 seconds, Fetched: 1 row(s)

# 分組函數(shù) group by
# 求部門的平均工資
# 注:select中出現(xiàn)的字段彰阴,如果沒(méi)有出現(xiàn)在組函數(shù)/聚合函數(shù)中,必須出現(xiàn)在group by里面,否則就會(huì)產(chǎn)生報(bào)錯(cuò)
hive> select deptno,avg(salary) from emp group by deptno;
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
10      2916.6666666666665
20      2175.0
30      1566.6666666666667
Time taken: 36.502 seconds, Fetched: 3 row(s)
# 求每個(gè)部門(deptno)、工作崗位(job)的最高工資(salary)
hive> select deptno,job,max(salary) from emp group by deptno,job;
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
10      CLERK   1300.0
10      MANAGER 2450.0
10      PRESIDENT       5000.0
20      ANALYST 3000.0
20      CLERK   1100.0
20      MANAGER 2975.0
30      CLERK   950.0
30      MANAGER 2850.0
30      SALESMAN        1600.0
Time taken: 36.096 seconds, Fetched: 9 row(s)
# 查詢平均工資大于2000的部門(使用having子句限定分組查詢)
hive> select deptno,avg(salary) from emp group by deptno having avg(salary) >2000;
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
10      2916.6666666666665
20      2175.0
Time taken: 24.71 seconds, Fetched: 2 row(s)

# case when then end(不會(huì)跑mr)
hive> select ename, salary, 
    > case
    > when salary > 1 and salary <= 1000 then 'LOWER'
    > when salary > 1000 and salary <= 2000 then 'MIDDLE'
    > when salary > 2000 and salary <= 4000 then 'HIGH'
    > ELSE 'HIGHEST'
    > end
    > from emp;
OK
SMITH   800.0   LOWER
ALLEN   1600.0  MIDDLE
WARD    1250.0  MIDDLE
JONES   2975.0  HIGH
MARTIN  1250.0  MIDDLE
BLAKE   2850.0  HIGH
CLARK   2450.0  HIGH
SCOTT   3000.0  HIGH
KING    5000.0  HIGHEST
TURNER  1500.0  MIDDLE
ADAMS   1100.0  MIDDLE
JAMES   950.0   LOWER
FORD    3000.0  HIGH
MILLER  1300.0  MIDDLE
Time taken: 0.096 seconds, Fetched: 14 row(s)
  • 多表join查詢:
# 創(chuàng)建測(cè)試表
hive> create table a(
    > id int, name string
    > ) row format delimited fields terminated by '\t';
OK
Time taken: 0.311 seconds
hive> create table b(
    > id int, age int
    > ) row format delimited fields terminated by '\t';
OK
Time taken: 0.142 seconds
# insert或load數(shù)據(jù) 最后表數(shù)據(jù)如下
hive> select * from a;
OK
1       zhangsan
2       lisi
3       wangwu
hive> select * from b;
OK
1       20
2       30
4       40
Time taken: 0.2 seconds, Fetched: 3 row(s)

# 內(nèi)連接 inner join = join 僅列出表1和表2符合連接條件的數(shù)據(jù)
hive> select a.id,a.name,b.age from a join b on a.id=b.id;
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
1       zhangsan        20
2       lisi    30
Time taken: 24.415 seconds, Fetched: 2 row(s)
# 左外連接(left join) 以左邊的為基準(zhǔn)镀脂,左邊的數(shù)據(jù)全部數(shù)據(jù)全部出現(xiàn),如果沒(méi)有出現(xiàn)就賦null值
hive> select a.id,a.name,b.age from a left join b on a.id=b.id;
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
1       zhangsan        20
2       lisi    30
3       wangwu  NULL
Time taken: 26.218 seconds, Fetched: 3 row(s)
# 右外連接(right join) 以右表為基準(zhǔn)
hive> select a.id,a.name,b.age from a right join b on a.id=b.id;
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
1       zhangsan        20
2       lisi    30
NULL    NULL    40
Time taken: 24.027 seconds, Fetched: 3 row(s)
# 全連接(full join)相當(dāng)于表1和表2的數(shù)據(jù)都顯示忘伞,如果沒(méi)有對(duì)應(yīng)的數(shù)據(jù)薄翅,則顯示Null.
hive> select a.id,a.name,b.age from a full join b on a.id=b.id;
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
1       zhangsan        20
2       lisi    30
3       wangwu  NULL
NULL    NULL    40
Time taken: 32.94 seconds, Fetched: 4 row(s)
# 笛卡爾積(cross join) 沒(méi)有連接條件 會(huì)針對(duì)表1和表2的每條數(shù)據(jù)做連接
hive> select a.id,a.name,b.age from a cross join b;
Warning: Map Join MAPJOIN[7][bigTable=a] in task 'Stage-3:MAPRED' is a cross product
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
1       zhangsan        20
1       zhangsan        30
1       zhangsan        40
2       lisi    20
2       lisi    30
2       lisi    40
3       wangwu  20
3       wangwu  30
3       wangwu  40
Time taken: 29.825 seconds, Fetched: 9 row(s)
3.利用Hive sql實(shí)現(xiàn)wordcount:
# 創(chuàng)建表 加載測(cè)試數(shù)據(jù)
hive> create table hive_wc(sentence string);
OK
Time taken: 0.149 seconds

[hadoop@hadoop000 ~]$ cat hive-wc.txt
hello,world,welcome
hello,welcome

hive> load data local inpath '/home/hadoop/hive-wc.txt' into table hive_wc;
Loading data to table default.hive_wc
Table default.hive_wc stats: [numFiles=1, totalSize=34]
OK
Time taken: 0.729 seconds
hive> select * from hive_wc;
OK
hello,world,welcome
hello,welcome
Time taken: 0.13 seconds, Fetched: 2 row(s)

# 獲取每個(gè)單詞 利用split分割
hive> select split(sentence,",") from hive_wc;
OK
["hello","world","welcome"]
["hello","welcome"]
Time taken: 0.163 seconds, Fetched: 2 row(s)
# explode把數(shù)組轉(zhuǎn)成多行 結(jié)合split使用如下
hive> select explode(split(sentence,",")) from hive_wc;
OK
hello
world
welcome
hello
welcome
Time taken: 0.068 seconds, Fetched: 5 row(s)
# 做group by操作 一條語(yǔ)句即可實(shí)現(xiàn)wordcount統(tǒng)計(jì)
hive> select word, count(1) as c 
    > from (select explode(split(sentence,",")) as word from hive_wc) t
    > group by word ;
Query ID = hadoop_20180703142525_af460dc7-287b-41b2-8af3-ba27cc0ea6ce
Total jobs = 1
...
OK
hello   2
welcome 2
world   1
Time taken: 34.168 seconds, Fetched: 3 row(s)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市氓奈,隨后出現(xiàn)的幾起案子翘魄,更是在濱河造成了極大的恐慌,老刑警劉巖舀奶,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暑竟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡伪节,警方通過(guò)查閱死者的電腦和手機(jī)光羞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門绩鸣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怀大,“玉大人纱兑,你說(shuō)我怎么就攤上這事』瑁” “怎么了潜慎?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蓖康。 經(jīng)常有香客問(wèn)我铐炫,道長(zhǎng),這世上最難降的妖魔是什么蒜焊? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任倒信,我火速辦了婚禮,結(jié)果婚禮上泳梆,老公的妹妹穿的比我還像新娘鳖悠。我一直安慰自己,他們只是感情好优妙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布乘综。 她就那樣靜靜地躺著,像睡著了一般套硼。 火紅的嫁衣襯著肌膚如雪卡辰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天邪意,我揣著相機(jī)與錄音九妈,去河邊找鬼。 笑死雾鬼,一個(gè)胖子當(dāng)著我的面吹牛萌朱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呆贿,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嚷兔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了做入?” 一聲冷哼從身側(cè)響起冒晰,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竟块,沒(méi)想到半個(gè)月后壶运,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浪秘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年蒋情,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埠况。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棵癣,死狀恐怖辕翰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狈谊,我是刑警寧澤喜命,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站河劝,受9級(jí)特大地震影響壁榕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赎瞎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一牌里、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧务甥,春花似錦牡辽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至哟绊,卻和暖如春因妙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背票髓。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工攀涵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洽沟。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓以故,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親裆操。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怒详,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容