hive字符串的分割,截取,正则提取与替换。
一,字符串的分割。
split函数(分割字符串)
语法: split(string str, string pat)
返回值: array
说明: 按照pat字符串分割str,会返回分割后的字符串数组
举例:
1.基本用法
hive> select split('abcdef', 'c') from test;
["ab", "def"]
2.截取字符串中的某个值
hive> select split('abcdef', 'c')[0] from test;
ab
3.特殊字符
如正则表达式中的特殊符号作为分隔符时,需做转义 (前缀加上)
hive> select split('ab_cd_ef', '\_')[0] from test;
ab
hive> select split('ab?cd_ef', '\\?')[0] from test;
ab
如果是在shell中运行,则(前缀加上\)
hive -e "select split('ab?cd_ef', '\\\\?')[0] from test"
注:有些特殊字符转义只需\,而有些需\\,eg.?。可能在语句翻译过程中经历经历几次转义。
二,字符串的截取。
substr函数格式 (俗称:字符截取函数)
格式1: substr(string string, int a, int b);
格式2:substr(string string, int a) ;
解释:
格式1:
1、string 需要截取的字符串
2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
3、b 要截取的字符串的长度
格式2:
1、string 需要截取的字符串
2、a 可以理解为从第a个字符开始截取后面所有的字符串。
当有三个参数时。
1、select substr('HelloWorld',0,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符
2、select substr('HelloWorld',1,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符
3、select substr('HelloWorld',2,3) value from dual; //返回结果:ell,截取从“e”开始3个字符
4、select substr('HelloWorld',0,100) value from dual; //返回结果:HelloWorld,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最大数量返回。
5、select substr('HelloWorld',5,3) value from dual; //返回结果:oWo
6、select substr('Hello World',5,3) value from dual; //返回结果:o W (中间的空格也算一个字符串,结果是:o空格W)
7、select substr('HelloWorld',-1,3) value from dual; //返回结果:d (从后面倒数第一位开始往后取1个字符,而不是3个。原因:下面红色 第三个注解)
8、select substr('HelloWorld',-2,3) value from dual; //返回结果:ld (从后面倒数第二位开始往后取2个字符,而不是3个。原因:下面红色 第三个注解)
9、select substr('HelloWorld',-3,3) value from dual; //返回结果:rld (从后面倒数第三位开始往后取3个字符)
10、select substr('HelloWorld',-4,3) value from dual; //返回结果:orl (从后面倒数第四位开始往后取3个字符)
(注:当a等于0或1时,都是从第一位开始截取(如:1和2))
(注:假如HelloWorld之间有空格,那么空格也将算在里面(如:5和6))
(注:虽然7、8、9、10截取的都是3个字符,结果却不是3 个字符; 只要 |a| ≤ b,取a的个数(如:7、8、9);当 |a| ≥ b时,才取b的个数,由a决定截取位置(如:9和10))
当有两个参数时:
11、select substr('HelloWorld',0) value from dual; //返回结果:HelloWorld,截取所有字符
12、select substr('HelloWorld',1) value from dual; //返回结果:HelloWorld,截取所有字符
13、select substr('HelloWorld',2) value from dual; //返回结果:elloWorld,截取从“e”开始之后所有字符
14、select substr('HelloWorld',3) value from dual; //返回结果:lloWorld,截取从“l”开始之后所有字符
15、select substr('HelloWorld',-1) value from dual; //返回结果:d,从最后一个“d”开始 往回截取1个字符
16、select substr('HelloWorld',-2) value from dual; //返回结果:ld,从最后一个“d”开始 往回截取2个字符
17、select substr('HelloWorld',-3) value from dual; //返回结果:rld,从最后一个“d”开始 往回截取3个字符
(注:当只有两个参数时;不管是负几,都是从最后一个开始 往回截取(如:15、16、17))
三,字符串的替换, hive的替换函数replace()
REPLACE
用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。
语法
REPLACE ( ‘‘string_replace1’’ , ‘‘string_replace2’’ , ‘‘string_replace3’’ )
参数
‘‘string_replace1’’
待搜索的字符串表达式。string_replace1 可以是字符数据或二进制数据。
‘‘string_replace2’’
待查找的字符串表达式。string_replace2 可以是字符数据或二进制数据。
‘‘string_replace3’’
替换用的字符串表达式。string_replace3 可以是字符数据或二进制数据。
实例
字符串类型参数:
SELECT REPLACE('abcdefg bcd','bcd','xxx')
结果为:axxxefg xxx
二进制类型参数:
1,SELECT REPLACE(100111001101,111,000)
2,SELECT REPLACE(100111001101,111,0)
1, 结果为:100000001101
2, 结果为:1000001101
注意:
1,如果参数是支持的字符数据类型之一,并且在string_replace1 中能够找到
string_replace2,那么返回替换后的字符串;反之, 返回 string_replace1;
2,如果参数是支持的 binary(二进制的一种表示格式) 数据类型之一,则返回二进制数据。
3,这个函数是全部替换。
这个函数有一点不足是不支持 text,ntext类型字段的替换。
四,字符串的正则函数(替换与提取)。
1,regexp
语法: A REGEXP B
操作类型: strings
描述: 功能与RLIKE相同
select count(*) from olap_b_dw_hotelorder_f where create_date_wid not regexp '\\d{8}'
与下面查询的效果是等效的:
select count(*) from olap_b_dw_hotelorder_f where create_date_wid not rlike '\\d{8}';
2,正则表达式解析提取函数—regexp_extract(str, regexp, idx)
str是被解析的字符串或字段名
regexp 是正则表达式
idx是返回结果 取表达式的哪一部分 默认值为1。
0表示把整个正则表达式对应的结果全部返回
1表示返回正则表达式中第一个() 对应的结果 以此类推
注意点:
要注意的是idx的数字不能大于表达式中()的个数。
否则报错:
各种操作符的运算优先级:
/ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和顺序
实例:
1) select regexp_extract('hitdecisiondlist','(i)(.*?)(e)',0) ;
itde
2) select regexp_extract('hitdecisiondlist','(i)(.*?)(e)',1) ;
i
i3) select regexp_extract('hitdecisiondlist','(i)(.*?)(e)',2) ;
td
4) select regexp_extract('x=a3&x=18abc&x=2&y=3&x=4','x=([0-9]+)([a-z]+)',2) from default.dual;
abc
3,正则表达式替换函数:regexp_replace
语法: regexp_replace(string A, string B, string C)
返回值: string
说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。
例子:
hive> select regexp_replace('foobar', 'oo|ar', '') from iteblog;
fb
关于regexp_replace函数的正则详细讲解请参考:
1,https://blog.csdn.net/gxftry1st/article/details/22489275
2,https://blog.csdn.net/qingkong_0802141/article/details/79897859