1.根据分割符截取
1.1 split函数
select
split('a:f:c',':')[0],
split('a:f:c',':')[2]
1.2 regexp_extract函数
select
regexp_extract('a:f:c','(.*):(.*):(.*)',1),
regexp_extract('a:f:c','(.*):(.*):(.*)',3)
select
regexp_extract('a:f:c','(.*):.*:.*'),
regexp_extract('a:f:c','.*:.*:(.*)')
1.3 substr函数
select
substr('a:f:c',0,1),
substr('a:f:c',5,1)
注:split函数将字符串切分为字符串数组。所以数组的指标是从0开始。如果超过了数组的长度返回null。substr函数适合定长的字符串截取,如果起始位置超过了字符串长度返回的是空串。在实际中最好使用split函数,regexp_extract函数效率低,substr缺乏灵活性。
前段时间看mysql优化中like 'xx%'比substr(0,2)='xx'效率好,like可以使用mysql的索引,substr则是全表扫描。但是在hive却是相反,hive没有索引是对全部数据都执行相应的函数
2.截取字符之前的数据
2.1 substring_index函数
select
substring_index('a:f:c',':',1)
2.2 substr函数+instr函数
select
substr('a:f:c',0,instr('a:f:c',':')-length(':'))
2.3 regexp_extract函数
select
regexp_extract('a:f:c','^(.*?):')
2.4 split函数
select
split('a:f:c',':')[0]
2.5 regexp_replace函数
select
regexp_replace('a:f:c',':.*','')
注:substring_index函数需要新的hive版本,我司的hive版本就没有。使用regexp_extract和regexp_replace函数里要注意正则表达式贪婪匹配和非贪婪匹配的区别 .* 和 .*?
3.截取字符之后的数据
3.1 substring_index函数
select
substring_index('a:f:c',':',-1)
3.2 regexp_extract函数
select
regexp_extract('a:f:c','.*:(.*)$',1)
3.2 regexp_replace函数
select
regexp_replace('a:f:c','.*:','')
3.3 substr函数+instr函数
select
substr('a:f:c',instr('a:f:c','a:f:')+length('a:f:'))
来源:CSDN
作者:weixin_42412645
链接:https://blog.csdn.net/weixin_42412645/article/details/103709580