赞
踩
hive 查询操作:
1、列匹配正则表达式
select 查询列使用正则表达式匹配列,hive 0.13 版本之前直接用。0.13 及后续版本需要开设置 hive 的属性
set hive.support.quoted.identifiers=none;
hive (mydb)> select `price.*` from stocks;
OK
3.31 1.31 3.94 15.45 34.0
8.81 1.31 3.94 15.15 14.0
2.31 3.21 6.54 15.45 34.0
3.31 1.31 3.94 15.45 34.0
8.81 1.31 3.94 15.15 14.0
3.31 1.31 3.94 15.45 34.0
8.81 1.31 3.94 15.15 14.0
Time taken: 0.109 seconds, Fetched: 7 row(s)
hive (mydb)> desc stocks;
OK
exchanges string
symbol string
ymd string
price_open float
price_high float
price_low float
price_close float
volume int
2、查询集合数据类型,Hive 输出的格式
hive (mydb)> desc employees;
name string Employee name
salary float Employee salary
subordinates array<string> Name of subordinates
deductions map <string,float> keys are deductions name,values are percentages
address struct<street:string,city:string,state:string,zip:int> Home address
hive (mydb)> select * from employees;
lisi 1402.65 ["chengliu","wangba"] {"guoshui":0.1,"dishui":0.05,"ps":0.02} {"street":"longhua","city":"shenzhen","state":"guangdong","zip":null}
lisi 1402.65 ["chengliu","wangba"] {"guoshui":0.1,"dishui":0.05,"ps":0.02} {"street":"longhua","city":"shenzhen","state":"guangdong","zip":null}
wangwu 154012.34 ["zhaoliu","zhangwu"] {"guoshui":0.1,"dishui":0.05,"ps":0.02} {"street":"futian","city":"shenzhen","state":"guangdong","zip":51800
array:元素是 string 类型,输出会使用双引号括起来,元素之间使用逗号隔开
string: 基本数据类型,string 输出不使用双引号括起来
map: key 是 string 类型,value 是 float 类型。输出 {‘key’:value}
struct: JSON map 输出
3、查看数组的元素。数组下角标从 0 开始
hive (mydb)> SELECT name,subordinates[0],subordinates[1] FROM employees;
lisi chengliu wangba
lisi chengliu wangba
wangwu zhaoliu zhangwu
4、引用 map 中的元素
hive (mydb)> SELECT name,deductions["guoshui"] FROM employees;
lisi 0.1
lisi 0.1
wangwu 0.1
如果输入的key不存在会返回NULL
5、引用 struct 中的元素
hive (mydb)> SELECT name,address.city FROM employees;
lisi shenzhen
lisi shenzhen
wangwu shenzhen
6、数学函数
#rount(d) d DOUBLE return BIGINT
# 四舍五入,只关注第一位小数是否大于等于5,大于或等于5,整数部分加1,然后返回,小于5,直接返回整数部分。最终返回整数部分和一位小数.0
hive (mydb)> select round(5.2312934394392);
5.0
hive (mydb)> select round(5.6312934394392);
6.0
hive (mydb)> select round(5.4);
5.0
hive (mydb)> select round(5.5);
6.0
#round(m,n) m DOUBLE,n int 表示保留几位小数,其他的四舍五入。 return DOUBLE
hive (mydb)> select round(5.11654546,3);
5.117
hive (mydb)> select round(5.11644546,3);
#floor(d) d DOUBLE return BIGINT 舍弃小数部分,返回整数部分,注意精度
hive (mydb)> select floor(3.6989080384023840);
3
hive (mydb)> select floor(3.69);
3
hive (mydb)> select floor(3.09);
3
hive (mydb)> select floor(2.999999999999999);
2
hive (mydb)> select floor(2.9999999999999998); #这个是临界值
3
hive (mydb)> select floor(2.9999999999999999);
3
#ceil(d) 和 ceiling(d) 两个函数一样 d DOUBLE return BIGINT。舍弃小数部分整数+1。同样要注意精度
hive (mydb)> select ceil(5.080982304823089402394);
6
hive (mydb)> select ceil(5.980982304823089402394);
6
hive (mydb)> select ceil(5.01);
6
hive (mydb)> select ceil(4.99);
hive (mydb)> select ceil(4.0000000000000001);
4
hive (mydb)> select ceil(4.000000000000001);# 临界值
5
hive (mydb)> select ceiling(4.0000000000000001);
4
hive (mydb)> select ceiling(4.000000000000001);
5
# rand() rand(seed) seed INT 随机因子 return DOUBLE 随机数
hive (mydb)> select rand();
0.17106158941936 # 小于1的随机数
hive (mydb)> select rand(1); # 无论这条命令运行多少次,值都不会发生变化,随机返回一个固定的数
0.7308781907032909 # 带随机因子后,返回固定小于1的double类型的小数。除非随机因子发生变化,否则返回的值不变
#exp(d) d DOUBLE return DOUBLE
hive (mydb)> select exp(1); # e=2.718281828459045
2.718281828459045
hive (mydb)> select exp(2); # e * e
7.38905609893065
hive (mydb)> select exp(3.5);
33.11545195869231
hive (mydb)> select exp(0.5);
1.6487212707001282
hive (mydb)> select exp(-0.5);
0.6065306597126334
# ln(d) d DOUBLE return DOUBLE
# log10(d),log2(d) d DOUBLE return DOUBLE
# log(m,n) m,n DOUBLE return DOUBLE 求以m为底n的对数
hive (mydb)> select ln(10); # ln10 以e为低10的对数
2.302585092994046
hive (mydb)> select log10(10);
1.0
hive (mydb)> select log10(100); #log100 以10为低100的对数
2.0
hive (mydb)> select log10(89.06);
1.949682690795204
hive (mydb)> select log2(8); #以2为低8的对数
3.0
hive (mydb)> select log2(20);
4.321928094887363
hive (mydb)> select log(4,64); #以4为低64的对数。log(m,n) 以m为低n的对数。m,n都为double类型
3.0
hive (mydb)> select log(2,64);
6.0
# power(m,n) pow(m,n) 这两个函数功能一样 m,n DOUBLE return DOUBLE
hive (mydb)> select pow(2,3);
8.0
hive (mydb)> select pow(3,4); # 3^4=81
81.0
hive (mydb)> select power(2,4); # 2^4=16
16.0
hive (mydb)> select power(2,3.2);
9.18958683997628
hive (mydb)> select power(16,0.5);#0.5 次幂也就是求开平方根
4.0
# sqrt(d) d DOUBLE
hive (mydb)> select sqrt(16); #求开平方根
4.0
# bin(d) d BIGINT 或者 STRING return DOUBLE
hive (mydb)> select bin(20); #10 进制转换2进制
10100
hive (mydb)> select bin(255);
11111111
# hex(d) d BINARY 或者 STRING 或者 BIGINT return STRING
hive (mydb)> select hex(255);# 10 进制转换16进制
FF
hive (mydb)> select hex(111111);
1B207
hive (mydb)> select hex('111111'); # 将字符串转换成16进制,acs码转换
313131313131
hive (mydb)> select hex('a'); # a --> 97 十进制,查asc 码表
61
hive (mydb)> select hex('A'); # hex(d) d 可以是数值类型,string 类型,以及binary类型。
41
# binary 类型不知道如何换算,1 --> 31 10--> D7
hive (mydb)> select unhex('c'); # 这个没有输出,不知道什么原因。unhex(d) d:string 类型,返回binary类型
# CONV(m,n,k) m INT 或者 STRING 类型;n,k INT return STRING 将m 有n进制转换成k进制。注意m的值要符合n进制。如2进制,m的值只能是0或者1组成
hive (mydb)> select conv(10,2,8); # 将10 2进制 转换为8进制
2
hive (mydb)> select conv(255,2,16); # conv(num,i,j) 将num 由i进制转换成j进制。5在2进制中是不存在的
0
hive (mydb)> select conv(255,10,16);
FF
hive (mydb)> select conv(255,8,16);
AD
hive (mydb)> select conv(255,2,16);
0
hive (mydb)> select conv(11111111,2,16); # 2进制只有01
FF
hive (mydb)> select conv('ABCD',16,2); # conv(string,i,j) 将string这个字符串转换成数字,然后由i进制转换成j进制
1010101111001101
hive (mydb)> select conv('FF',16,2);
11111111
hive (mydb)> select conv('ff',16,2); # 大小写不敏感
11111111
#abs(d) d DOUBLE return DOUBLE
hive (mydb)> select abs(-12.32);#求绝对值
12.32
hive (mydb)> select abs(11.23);
11.23
# pom(m,n) m,n INT return INT
hive (mydb)> select pmod(10,3); # pmod(m,n) = m % n 取模
1
hive (mydb)> select pmod(10,2);
0
hive (mydb)> select pmod(3.8,2); # 可以支持小数对整数的取模,甚至是小数对小数的取模
1.7999999999999998
hive (mydb)> select pmod(3.8,2.0);
1.7999999999999998
hive (mydb)> select pmod(3.8,1.9);
0.0
hive (mydb)> select pmod(3.8,1.8);
0.19999999999999973
#sin(d) d DOUBLE return DOUBLE
#cos(d) d DOUBLE return DOUBLE
#asin(d) d DOUBLE return DOUBLE
#acos(d) d DOUBLE return DOUBLE
#tan(d) d DOUBLE return DOUBLE
#atan(d) d DOUBLE return DOUBLE
#degrees(d) d DOUBLE return DOUBLE
#radians(d) d DOUBLE return DOUBLE
hive (mydb)> select sin(90); # sin(d) d表示弧度,不是角度 sin90度=1
0.8939966636005579
hive (mydb)> select sin(0);
0.0
hive (mydb)> select sin(180);
-0.8011526357338304
hive (mydb)> select sin(45);
0.8509035245341184
hive (mydb)> select sin(360);
0.9589157234143065
hive (mydb)> select cos(0);
1.0
hive (mydb)> select cos(90); # cos90度=0 cos(d) d 表示弧度
-0.4480736161291702
hive (mydb)> select sin(90);
0.8939966636005579
hive (mydb)> select cos(90);
-0.4480736161291702
hive (mydb)> select asin(0.5); # asin(d) d 为double类型 asin 和 sin 是逆运算,相当于乘法和除法一样
0.5235987755982989
hive (mydb)> select sin(0.5235987755982989);
0.5
hive (mydb)> select sin(asin(0.5));
0.5
hive (mydb)> select cos(acos(0.4)); #scos 和 cos 是逆运算。有些时候会出现些精度上的损耗,需要四舍五入
0.4000000000000001
hive (mydb)> select cos(acos(0.28));
0.28
hive (mydb)> select tan(20); #正切 tan(d) d 单位弧度
2.237160944224742
hive (mydb)> select tan(atan(20));#atan 和 tan 一对逆运算。同样有精度损失。
19.999999999999993
hive (mydb)> select atan(20);
1.5208379310729538
hive (mydb)> select tan(1.5208379310729538);
19.999999999999993
hive (mydb)> select degrees(1); # degrees(d) d为double类型,将弧度转换成角度
57.29577951308232
hive (mydb)> select sin(radians(30));# radians(d) 与 degrees(d) 逆运算
0.49999999999999994
hive (mydb)> select radians(30);
0.5235987755982988
hive (mydb)> select sin(0.5235987755982988); # sin30度=0.5
0.49999999999999994
hive (mydb)> select degrees(radians(30)); # 有精度上的损失
29.999999999999996
# positive(m) m INT 或者DOUBLE return INT DOUBLE。这个函数感觉没有什么用,输入INT/DOUBLE 类型的值,返回INT/DOUBLE 类型的值,输入什么返回什么。
hive (default)> select positive(9.20);
9.2
hive (default)> select positive(-9);
-9
hive (default)> select positive(-9.20);
-9.2
hive (default)> select positive(10);
10
hive (default)> select positive(10);
10
#negative(i) i DOUBLE/INT return DOUBLE/INT 返回-i,正数返回负数,负数返回正数
hive (default)> select negative(10);
-10
hive (default)> select negative(-10);
10
hive (default)> select negative(-9.55);
9.55
hive (default)> select negative(9.55);
-9.55
# sign(d) d DOUBLE return FLOAT 如果d 为正数(d>0) 返回1.0。如果d 为负数(d <0) 返回-1.0,否则返回0.0
hive (default)> select sign(3.13445);
1.0
hive (default)> select sign(-3.13445);
-1.0
hive (default)> select sign(0);
0.0
# e(),pi() 这两个函数没有参数 retrun DOUBLE
hive (default)> select e();
2.718281828459045
hive (default)> select pi();
3.141592653589793
7、hive 算式运算符
# A / B
hive (default)> select (7 / 2);
3.5
hive (default)> select (7 / 3);
2.3333333333333335
#按位取与
hive (default)> select ( 55 & 50);
50
hive (default)> select conv(55,10,2);
110111
hive (default)> select conv(50,10,2);
110010
# 按位异或。异或是相同为0,不同为1
hive (default)> select ( 55 ^ 50);
5
hive (default)> select conv(50,10,2);
110010
hive (default)> select conv(55,10,2);
110111
# 按位取反。不知道怎么计算的,~a = -(a + 1)
hive (default)> select (~ 55);
-56
hive (default)> select (~ 50);
-51
hive (default)> select (~ 35);
-36
hive (default)> select (~ 26);
-27
hive (default)> select (~ (-26));
25
hive (default)> select (~ (-2));
1
hive (default)> select (~ (-45));
44
hive (default)> select (~ (-45.12)); # 不能是小数
FAILED: SemanticException [Error 10014]: Line 1:12 Wrong arguments '45.12': No matching method for class org.apache.hadoop.hive.ql.udf.UDFOPBitNot with (double). Possible choices: _FUNC_(bigint) _FUNC_(int) _FUNC_(smallint) _FUNC_(tinyint)
hive (default)> select (~ (-35));
34
8、hive 聚合函数
使用聚合函数设置 hive.map.aggr 为 true,可以提高聚合函数的性能
set hive.map.attr=ture
这个设置会增加内存的使用率
# 这个例子中,设置了hive.map.attr=true 会触发在map阶段进行的"顶级"聚合过程。(非顶级的聚合过程会在执行一个GROUP BY后进行)
hive (default)> SELECT COUNT(*),AVG(salary) FROM employees;
7 102857.14285714286
# 可以使用多次 DISTINCT() 函数
hive (default)> SELECT COUNT(DISTINCT ymd),COUNT(DISTINCT volume) FROM stocks;
741 97679
9、查询 hive 内嵌的函数
hive -S -e 'show functions' | grep FUNCTION_NAME
#显示某个具体函数的帮助信息
hive -S -e 'desc function extended FUNCTION_NAME'
例如:hex()
hive -S -e 'desc function extended hex'
hex(n, bin, or str) - Convert the argument to hexadecimal
If the argument is a string, returns two hex digits for each character in the string.
If the argument is a number or binary, returns the hexadecimal representation.
Example:
> SELECT hex(17) FROM src LIMIT 1;
'H1'
> SELECT hex('Facebook') FROM src LIMIT 1;
'46616365626F6F6B'
10、表生成函数:将单列扩展成多列,或者多行,与聚合函数相反
hive (default)> SELECT explode(subordinates) AS sub FROM employees;
Mary Smith
Todd Jones
Bill King
John Doe
Fred Finance
Stacy Accountant
hive (default)> SELECT subordinates FROM employees;
["Mary Smith","Todd Jones"]
["Bill King"]
[]
[]
["John Doe","Fred Finance"]
["Stacy Accountant"]
[]
# subordinates 字段为空的话,那么不会产生行的记录(一行),如果不为空的话,那么这个数组的每一个元素都将产生一行新的记录
# AS sub 定义列别名,也可以不用定义,看个人需求
11、hive 内置函数
ascii (‘abc’) 返回’abc’这个字符串中首字符’a’对应的 ASCII 码
hive (default)> select ascii('abc');
97
hive (default)> select ascii('123');
49
hive (default)> select ascii('1abc');
49
hive (default)> select ascii(',abc');
44
bade64 (b) 函数,b 是 binary 类型,将 b 转换为基于 64 位的字符串
# unhex() 函数返回binary类型,这个类型貌似不能用键盘输入
hive (default)> select unhex("234");
4
hive (default)> select base64(unhex("234"));
AjQ=
binary () 函数将输入转换成 2 进制值
hive (default)> select binary('abc');
abc
hive (default)> select base64(binary('abc'));
YWJj
cast (expr,type) expr 是 hive 任意的数据类型,type 是要转换的数据类型
hive (default)> select cast('abc' as INT);
NULL
hive (default)> select cast('123' as INT);
123
hive (default)> select cast('123' as FLOAT);
123.0
concat () concat_ws () 拼接字符串,可以拼接 STRING 类型的字符串,也可以拼接 BINARY 类型的字符串
#将2进制字节码按照输入的顺序拼接成一个字符串,返回STRING 类型
hive (default)> select concat(binary('abc'),binary('cdr'),binary('erf'));
abccdrerf
# 所拼接的字符串类型可以不相同
hive (default)> select concat(binary('abc'),binary('cdr'),binary('erf'),'abc');
abccdrerfabc
hive (default)> select concat('abc','edf','ghj');
abcedfghj
# concat_ws() 需要指定连接字符串
hive (default)> select concat_ws('-','abc','edf','ghj');
abc-edf-ghj
# hive 1.2.2 concat_ws() 不支持二进制类型
encode (BINARY bin,STRING charset) 和 decode (STRING str,STRING charset) 这两个函数想反,相当于 + 和 - 这两个操作
支持的字符集:US_ASCII,ISO-8859-1,UTF-8,UTF-16BE,UTF-16LE,UTF-16
hive (default)> select decode(binary('abc'),'utf-8');
abc
hive (default)> select decode(binary('98ecf'),'ISO-8859-1');
98ecf
hive (default)> select decode(binary('#@1abv'),'UTF-16');
⍀ㅡ扶
hive (default)> select encode('#13lad','utf-16be');
#13lad
hive (default)> select encode('#13lad','ISO-8859-1');
#13lad
find_in_set (str,str_array) str:STRING,str_array: 包含”,” 的字符串,当然也可以不包含”,” 的字符串。在 str_array 以逗号分隔的字符串中查找 str 出现的位置
hive (default)> select find_in_set('ab','abc,de,erg,ab,ef');
4
hive (default)> select find_in_set('ab','abcdeerg-abef');
0
# 不包含","的字符串,返回0
hive (default)> select find_in_set('ab','ab-cde-erg-ab-ef');
0
hive (default)> select find_in_set('ab','ab,cde-erg-ab-ef');
1
format_number (num,d) num:NUMBER,d:INT。将 num 格式化”#,###,###.##”.d 表示小数的位数,如果为 0 表示没有小数
# 四舍五入
hive (default)> select format_number(123456.49,0);
123,456
hive (default)> select format_number(123456.59,0);
123,457
hive (default)> select format_number(123456.5945687,5);
123,456.59457
s in (val1,val2,val3,….) s: 任意类型,val: 任意类型。s 和 val 任一个相同就可以了。
# 123,‘123’ 相同
hive (default)> select '123' in ('123','abc','456',456);
hive (default)> select '123' in (123,'abc','edf');
true
hive (default)> select 123 in (123,'abc','edf');
true
hive (default)> select 123 in ('123','abc','edf');
hive (default)> select 'abcd' in ('123',231,'abcde');
false
get_json_object (json_string,path) json_string:STRING,path:STRING。json_string json 类型的字符串,path 路径
从给定路径上的 JSON 字符串中抽取出 JSON 对象,并返回这个对象的 JSON 字符串形式。如果输入的 JSON 字符串是非法的,在返回 NULL,如果没有匹配到也会返回 NULL
select get_json_object(
'{
"stroe":
{
"fruit":
[
{"weight":8,"type":"apple"},
{"weight":9,"type":"pear"}
],
"bicycle":{"price":19.951,"color":"red1"}
},
"email":"amy@only_for_json_udf_test.net","owner":"amy1"
}',
'$.owner1'
);
# 输出:
amy1
in_file (s,filename) s:STRING,filename:STRING。filename 文件的路径 (最好是绝对路径)。s 字符串和 filename 文件中某一行完全匹配,返回 true 否则 false
# cat /root/hive.txt
hello hive!
hive is hadoop tools
hive (default)> select in_file("Hello hive!",'/root/hive.txt');
false
hive (default)> select in_file("hello hive!",'/root/hive.txt');
true
instr(s,sub) s:STRING,sub:STRING return INT。
在 s 中搜索 sub 子串,返回第一次出现的位置,索引从 1 开始
hive (default)> select instr('adasdfhabchksdkfabcdsrabcdsd','abc');
8
hive (default)> select instr('efgabcdeabcdesrabcde','abc');
4
hive (default)> select instr('efgabcdeabcdesrabcde','abd');
0
lower (s) lcase (s) s:STRING。return STRING。将 s 中大写转换成小写。小写直接输出
upper(STRING s)
ucase(STRING s)
小写转换成大写
hive (default)> select lower('abcd');
abcd
hive (default)> select lower('Abcd');
abcd
hive (default)> select lower('Ab12Cd');
ab12cd
hive (default)> select lcase('123AvcDerR');
123avcderr
hive (default)> select lcase('123abdser');
123abdser
hive (default)> select upper('abcdDER');
ABCDDER
hive (default)> select ucase('abcdDER');
ABCDDER
length (s) s:STRING, 返回 INT。计算字符串 s 的长度
hive (default)> select length('abcdser');
7
locate (substr,str [,pos]) substr:STRING,str:STRING,pos:INT。return INT。在字符串 str 中从 pos 位置 (包含 pos) 开始查找 substr,返回第一次出现的位置,索引从 1 开始
hive (default)> select locate('abc','defsdabcsfsdfabc',7);
14
hive (default)> select locate('abc','defsdabcsfsdfabc');
6
hive (default)> select locate('bar','foobarbar');
4
hive (default)> select locate('bar','foobarbar',5);
7
lpad (s,len,pad) s:STRING,len:INT,pad:STRING. 从左边开始对字符串 pad 进行填充,最终达到 len 的长度为止,如果 s 的长度大于 len 将舍弃多余的部分
rpad(STRING s,INT len,STRING pad)
hive (default)> select lpad('abc',10,'-');
-------abc
hive (default)> select lpad('abcerfsafgsdf',5,'-');
abcer
hive (default)> select rpad('abcd',20,'*');
abcd****************
ltrim (s) 如果 s 最左边有空格,将最左边的空格删除,返回 STRING
hive (default)> select ltrim(' hive ');
hive
#验证只删除了左边的空格,没有删除右边的空格
# a=hive -S -e "select ltrim(' hive ')"
# echo ${#a} 输出7
# echo $a 输出 a
hive (default)> select ltrim(' hive ad');
hive ad
hive (default)> select ltrim('adr hive ad');
adr hive ad
# 删除又不的空格,如果左边有空格保留
hive (default)> select rtrim(' abcd ');
abcd
#删除前后的空格
hive (default)> select trim(' hive ');
hive
parse_url(url,partname[,key]) url:STRING,partname:STRING,key:STRING
这个函数的功能是解析 url。partname 表示要抽取部分 (区分大小写):HOST,PATH,QUERY,REF,PROTOCOL,AUTHORITY,FILE,USERINFO,QUERY:
hive (default)> SELECT parse_url('http://facebook.com/path/p1.php?query=1', 'HOST');
facebook.com
hive (default)> SELECT parse_url('http://facebook.com/path/p1.php?query=1', 'PATH');
/path/p1.php
hive (default)> SELECT parse_url('http://facebook.com/path/p1.php?query=1', 'PROTOCOL');
http
hive (default)> SELECT parse_url('http://facebook.com/path/p1.php?query=1', 'FILE');
/path/p1.php?query=1
# HOST AUTHORITY 这两个参数输出内容相同
hive (default)> SELECT parse_url('https://baike.baidu.com/item/url/110640?fr=aladdin', 'AUTHORITY');
baike.baidu.com
hive (default)> SELECT parse_url('https://baike.baidu.com/item/url/110640?fr=aladdin', 'HOST');
baike.baidu.com
hive (default)> SELECT parse_url('https://baike.baidu.com/item/url/110640?fr=aladdin#abcde', 'ref');
NULL
hive (default)> SELECT parse_url('https://baike.baidu.com/item/url/110640?fr=aladdin#abcde', 'REF');
abcde
hive (default)> SELECT parse_url('http://facebook.com/path/p1.php?query=2', 'QUERY', 'query');
2
printf (format,Obj…args) 安装 printf 格式化输出字符串。format:STRING
hive (default)> SELECT printf("Hello World %d %s", 100, "days");
Hello World 100 days
hive (default)> SELECT printf("Hello World %d\n%s", 100, "days");
Hello World 100
days
regexp_extract(STRING subject,STRING regex_pattern,INT index)
subject 字符串
regex_pattern 匹配模式,可以有多个模式
index:表示输出第几个模式,从 1 开始
# \d 匹配一位数字:0-9,但是\ 需要转义,否则无法匹配成功
hive (default)> SELECT regexp_extract('abc-456', '^([a-z]+)-(\\d)',1);
abc
hive (default)> SELECT regexp_extract('abc-456', '^([a-z]+)-(\\d+)',2);
456
hive (default)> select regexp_extract('foothebar', 'foo(.*?)(bar)', 2);
bar
hive (default)> select regexp_extract('foothebar', 'foo(.*?)(bar)', 1);
the
regexp_replace(STRING s,STRING regex,STRING replacement)
s::字符串
regex:java 正则表达式
replacement:一个字符串,将匹配到的字符串使用这个字符串替换,如果为空,表示去掉匹配到的字符串。这个参数即使为空也需要给定否则报语法错误
hive (default)> select regexp_replace("foobar", "oo|ar", "");
fb
hive (default)> select regexp_replace("foobar", "oo|ar", "a");
faba
hive (default)> select regexp_replace("foobar", "oo|ar", "abcd");
fabcdbabcd
# 同样 \ 需要转义
hive (default)> select regexp_replace("foobarii33", "oo|ar|\\d+","aa");
faabaaiiaa
repeat(STRING s,INT n)
将字符串 s 重复 n 次
hive (default)> select repeat('abc',3);
abcabcabc
hive (default)> select repeat('123',3);
123123123
hive (default)> select repeat('abc123def',3);
abc123defabc123defabc123def
reverse(STRING s)
将 s 逆序输出
hive (default)> select reverse('abc');
cba
hive (default)> select reverse('abcerfg');
gfrecba
sentences(STRING s,STRING lang,STRING locale)
lang: 语言环境
locale: 地区,定义字符集
返回字符串数组
hive (default)> SELECT sentences('Hello there! I am a UDF.');
[["Hello","there"],["I","am","a","UDF"]]
hive (default)> SELECT sentences('Hello there I am a UDF.');
[["Hello","there","I","am","a","UDF"]]
hive (default)> SELECT sentences('Hello there.I am a UDF.');
[["Hello","there.I","am","a","UDF"]]
hive (default)> SELECT sentences('Hello there . I am a UDF.');
[["Hello","there"],["I","am","a","UDF"]]
# deductions map 类型,查询有多少个键值对
hive (default)> select size(deductions) from employees;
3
3
3
3
3
3
3
hive (default)> select deductions from employees;
{"Federal Taxes":0.2,"State Taxes":0.05,"Insurance":0.1}
{"Federal Taxes":0.2,"State Taxes":0.05,"Insurance":0.1}
{"Federal Taxes":0.15,"State Taxes":0.03,"Insurance":0.1}
{"Federal Taxes":0.15,"State Taxes":0.03,"Insurance":0.1}
{"Federal Taxes":0.3,"State Taxes":0.07,"Insurance":0.05}
{"Federal Taxes":0.3,"State Taxes":0.07,"Insurance":0.05}
{"Federal Taxes":0.15,"State Taxes":0.03,"Insurance":0.1}
# subordinates array 类型,查询元素的个数
hive (default)> select size(subordinates) from employees;
2
1
0
0
2
1
0
hive (default)> select subordinates from employees;
["Mary Smith","Todd Jones"]
["Bill King"]
[]
[]
["John Doe","Fred Finance"]
["Stacy Accountant"]
[]
space (INT n) 返回 n 个空格
split(STRING s,STRING pattern)
对字符串 s 使用 pattern 进行分割,返回一个字符串数组
hive (default)> select split('abc edf ert','[ ]');
["abc","edf","ert"]
hive (default)> SELECT split('oneAtwoBthreeC', '[ABC]');
["one","two","three",""]
hive (default)> select split('abc edf ert','');
["a","b","c"," ","e","d","f"," ","e","r","t",""]
hive (default)> select split('abc edf ert',' ');
["abc","edf","ert"]
str_to_map(STRING s[,STRING delim1,STRING delim2])
delim1: 键值对的分隔符,默认值是逗号分隔符 (“,”)
delim2: 键和值之间的分隔符,默认值是冒号分隔符 (“:”)
return MAP
hive (default)> select str_to_map('abc-cde,erf-avd',',','-');
{"abc":"cde","erf":"avd"}
hive (default)> select str_to_map('abc:cde,erf:avd');
{"abc":"cde","erf":"avd"}
hive (default)> select str_to_map('abcder','=','-');
{"abcder":null}
hive (default)> select str_to_map('abrefcoiriocqeriq','c','r');
{"ab":"ef","qe":"iq","oi":"io"}
substr(STRING s,INT start_index,INT len)
substring(STRING s,INT start_index,INT len)
从 start_index (包含) 位置开始截取长度为 len 个字符串
hive (default)> select substr('abcde',3,2);
cd
hive (default)> select substring('abcde',3,2);
cd
# 可以截取二进制类型的字符串
hive (default)> select substr(binary('abcdergh'),3,4);
cder
hive (default)> select substring(binary('abcdergh'),3,4);
cder
translate(STRING s, STRING input,STRING from)
input 和 from 长度相等,两者对应在原字符串中查找 input 包含的字符使用 from 中对应位置的字符替换
input 的长度大于 from,两者对应在原字符串中查找 input 包含的字符使用 from 中对应位置的字符替换,在原字符串中查找 input 中多余的字符,将其删除
input 长度小于 from,两者对应在原字符串中查找 input 包含的字符使用 from 中对应位置的字符替换。from 多余的字符忽略
# 将原字符串中a 替换成1,d替换成9,删除c
hive (default)> select translate('abcdef', 'adc', '19')
1b9ef
hive (default)> select translate('abcdef', 'ad', '19');
1bc9ef
hive (default)> select translate('abcdef', 'adc', '193');
1b39ef
# 4 多余的忽略掉
hive (default)> select translate('abcdef', 'adc', '1934');
1b39ef
hive (default)> select translate('a b c d', ' ', '');
abcd
# 将原字符串中"a" 替换成 1,将"d" 替换成 9,将"c" 替换成 3
hive (default)> select translate('abcdefsdfaerdsfdc', 'adc', '193');
1b39efs9f1er9sf93
unbase64 (STRING str) 将基于 64 位的字符串 str 转换成二进制值
hive (default)> select unbase64('abcd');
i�
from_unixtime(BIGINT,unixtime[,STRING format])
将 unix 时间戳转换成字符串,可以使用 format 格式化
hive (default)> SELECT FROM_UNIXTIME(1520584960,'yy-MM-dd HH:mm:ss');
18-03-09 08:42:40
hive (default)> SELECT FROM_UNIXTIME(1520584960,'yyyy-MM-dd HH:mm:ss');
2018-03-09 08:42:40
hive (default)> SELECT FROM_UNIXTIME(1520584960,'HH:mm:ss');
08:42:40
hive (default)> SELECT FROM_UNIXTIME(1520584960);
2018-03-09 08:42:40
unix_timestamp () 获取本地区当前时间戳
hive (default)> select unix_timestamp();
1520585915
unix_timestamp(STRING s)
s: 必须包含年月日,时分秒,格式”yyyy-MM-dd HH:mm:ss”
hive (default)> select unix_timestamp("2018-2-3");
NULL
hive (default)> select unix_timestamp("2018-2-3 12:20:11");
1517660411
hive (default)> select unix_timestamp("18-2-3 12:20:11");
-61596416389
hive (default)> select unix_timestamp("2018-2-3 12:20:11");
1517660411
hive (default)> select unix_timestamp("2018-2-3 12:20");
NULL
hive (default)> select unix_timestamp("2018-3-20",'yyyy-MM-dd');
1521504000
hive (default)> select unix_timestamp("12:39:00",'HH:mm:ss');
45540
hive (default)> select unix_timestamp("01:00:00",'HH:mm:ss');
3600
hive (default)> select unix_timestamp("2018-3-20",'HH:mm:ss');
NULL
hive (default)> select to_date('2018-02-31');
2018-03-03
hive (default)> select to_date('2018-02-30');
2018-03-02
hive (default)> select to_date('2018-02-29');
2018-03-01
hive (default)> select to_date('2018-02-28');
2018-02-28
hive (default)> select to_date('2018-3-3');
2018-03-03
year(STRING date) return INT
month(STRING date) return INT
day(STRING date) return INT
date 格式:’yyyy-MM-dd HH:mm:ss’ or ‘yyyy-MM-dd’
hive (default)> select year("2017-03-32");
2017
hive (default)> select year("2018-1-2 1:1:00");
2018
hive (default)> select month("2018-1-2 1:1:00");
1
hive (default)> select month("2018-05-06 1:1:00");
5
# day > 31 month自增 month > 12 year 自增
hive (default)> select month("2018-6-40 1:1:00");
7
hive (default)> select year("2018-16-40 1:1:00");
2019
# 2月份比较特殊
hive (default)> select day("2018-02-31 1:1:00"),month("2018-02-31 1:1:00");
3 3
hive (default)> select day("2018-02-29 1:1:00"),month("2018-02-29 1:1:00");
1 3
# 6 月没有31
hive (default)> select day("2018-06-31 1:1:00"),month("2018-06-31 1:1:00");
1 7
hour(STRING date) return INT
minute(STRING date) return INT
second(STRING date) return INT
date 格式:’yyyy-MM-dd HH:mm:ss’ or ‘HH:mm:ss’.
hive (default)> select hour("2018-02-23 20:10:00");
20
hive (default)> select hour("11:10:00");
11
hive (default)> select hour("2018-02-23 25:10:00"),day("2018-02-23 25:10:00");
1 23
# second 缝60进1,minute 缝60进1,hour缝24进1,second 进1给minute,minute进1给hour,但hour进1不会使day增加,即使是23:59:59 进1,day也会加1
hive (default)> select day("2017-12-31 23:59:1000000000000000000000"),month("2017-12-31 23:59:1000000000000000"),year("2017-12-31 23:59:10000000000");
31 12 2017
hive (default)> select hour("2017-12-31 23:59:60"),minute("2017-12-31 23:59:60"),second("2017-12-31 23:59:60");
0 0 0
hive (default)> select year("2017-12-31 23:59:60"),month("2017-12-31 23:59:60"),day("2017-12-31 23:59:60"),hour("2017-12-31 23:59:60"),minute("2017-12-31 23:59:60"),second("2017-12-31 23:59:60");
2017 12 31 0 0 0
# day 缝28/30/31 进1给month,month 缝12 进1,给year
hive (default)> select year("2018-12-32"),month("2018-12-32"),day("2018-12-32");
2019 1 1
weekofyear(STRING date) return INT
给出的日期是这一年的第几周
hive (default)> select weekofyear("2018-1-7");
1
hive (default)> select weekofyear("2018-1-8");
2
# day 不变,周也会变
hive (default)> select weekofyear("2018-1-7 23:59:61");
1
datediff(STRING end_date,STRING start_date)
两个日期之间相隔多少天数。大日期在前面,小日期在后面
hive (default)> select datediff('2018-10-12','2018-10-20');
-8
hive (default)> select datediff('2018-10-01','2018-03-12');
203
hive (default)> select datediff('2018-10-01','2018-03-12 23:61:00');
203
date_add(STRING date,INT days)
给定日期增加的天数,不含给定日期的
hive (default)> select date_add("2018-03-12",30);
2018-04-11
hive (default)> select date_add("2018-03-12",349);
2019-02-24
date_sub(STRING date,INT days)
给定日期减少 days 天
hive (default)> select date_sub("2018-03-12",2);
2018-03-10
from_utc_timestamp(STRING utc,STRING timezone)
utc 格式:’yyyy-MM-dd HH:mm:SS’
将 utc 时间转换成指定时区的时间
to_utc_timestamp(timestamp,STRING timezone)
# 感觉是hive的bug,相差时间不一致
hive (default)> select from_utc_timestamp('2018-03-11 08:00:00','CST');
2018-03-11 03:00:00
hive (default)> select from_utc_timestamp('2018-03-12 08:00:00','CST');
2018-03-12 03:00:00
hive (default)> select from_utc_timestamp('2018-01-01 08:00:00','CST');
2018-01-01 02:00:00
hive (default)> select from_utc_timestamp('2018-03-01 08:00:00','CST');
2018-03-01 02:00:00
# 一会相差5个小时,一会有相差6个小时
hive (default)> select to_utc_timestamp('2018-03-12 08:00:00','CST');
2018-03-12 13:00:00
hive (default)> select to_utc_timestamp('2018-01-01 08:00:00','CST');
2018-01-01 14:00:00
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。