开始之前,先了解几个命令:
在Hive CLI中,可以使用如下一些命令
显示当前会话有多少函数可用
show functions;
显示函数的描述信息
desc function concat;
显示函数的扩展描述信息
desc function extended concat;
现在来练习下Hive中的一些常用内置函数
先来查看下表winfunc:
hive (default)> desc winfunc; OK col_name data_type comment id int money float type string Time taken: 0.132 seconds, Fetched: 3 row(s) hive (default)> select * from winfunc; OK winfunc.id winfunc.money winfunc.type 1001 100.0 ABC 1001 150.0 BCD 1001 200.0 CDE 1001 150.0 DEF 1002 200.0 ABC 1002 200.0 ABC 1002 100.0 BCD 1002 300.0 CDE 1002 50.0 DEF 1002 400.0 EFG 1003 100.0 ABC 1003 50.0 BCD 1004 60.0 ABC Time taken: 1.177 seconds, Fetched: 13 row(s)
1. and和or的优先级
现在想要求下id为1001、1002的两个人工资为100.0时候的记录
hive (default)> select id,money,type from winfunc where id=1001 or id=1002 and money=100.0; OK id money type 1001 100.0 ABC 1001 150.0 BCD 1001 200.0 CDE 1001 150.0 DEF 1002 100.0 BCD Time taken: 0.13 seconds, Fetched: 5 row(s)
发现结果并不是我们想要的,为什么呢?其实是因为or和and优先级不一样导致的,因为and的优先级比or高,所以出现了上面的结果,如果要得到我们想要的结果,该怎么处理呢?
hive (default)> select id,money,type from winfunc where (id=1001 or id=1002) and money=100.0; OK id money type 1001 100.0 ABC 1002 100.0 BCD Time taken: 0.147 seconds, Fetched: 2 row(s)
2. cast类型转换
如果想要将上面结果中的money类型转换成int类型,该如何实现呢?
hive (default)> select id,cast(money as int),type from winfunc where (id=1001 or id=1002) and money =100.0; OK id money type 1001 100 ABC 1002 100 BCD Time taken: 2.489 seconds, Fetched: 2 row(s)
3. case...when
hive (default)> select case > when id='1001' then 'tom' > when id='1002' then 'kitty' > when id='1003' then 'jerry' > else 'others' > end > from winfunc group by id;
OK _c0 tom kitty jerry others Time taken: 1.505 seconds, Fetched: 4 row(s)
4. parse_url
语法:parse_url(string urlString, string partToExtract [, string keyToExtract])。
返回值:string
返回 URL 中指定的部分。 partToExtract 的有效值为: HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.
hive (default)> select > parse_url('http://master:50070/explorer.html#/hive','HOST') > from winfunc limit 1; OK _c0 master Time taken: 0.102 seconds, Fetched: 1 row(s)
5. concat
语法: concat(string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果,支持任意个输入字符串
hive (default)> select concat(type,'123') > from winfunc limit 3; OK _c0 ABC123 BCD123 CDE123 Time taken: 0.103 seconds, Fetched: 3 row(s)
6. concat_ws
语法: concat_ws(string SEP, string A, string B…)
返回值: string
说明:返回输入字符串连接后的结果, SEP 表示各个字符串间的分隔符
hive (default)> select concat_ws('_',type,'123') > from winfunc limit 3; OK _c0 ABC_123 BCD_123 CDE_123 Time taken: 0.99 seconds, Fetched: 3 row(s)
此外,concat_ws也可以处理数组,例如:
hive (default)> select concat_ws('_',split(type,'')) > from winfunc limit 1; OK _c0 _A_B_C_ Time taken: 0.125 seconds, Fetched: 1 row(s)
先将winfunc表中的第一行的type列的值通过split函数来切分成一个数组,然后通过concat_ws来将该数组中的没两个元素之间加上“_”。
7. collect_set
collect_set(x) - Returns a set of objects with duplicate elements eliminated
hive (default)> select collect_set(id) > from winfunc;
OK _c0 [1001,1002,1003,1004] Time taken: 1.546 seconds, Fetched: 1 row(s)
8. collect_list
collect_list(x) - Returns a list of objects with duplicates
Time taken: 1.546 seconds, Fetched: 1 row(s) hive (default)> select collect_list(id) > from winfunc;
OK _c0 [1001,1001,1001,1001,1002,1002,1002,1002,1002,1002,1003,1003,1004] Time taken: 2.894 seconds, Fetched: 1 row(s)
也就是说collect_set会去重,而collect_list不会去重。