hive字符串截取

爱⌒轻易说出口 提交于 2019-12-27 02:27:48
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:'))


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!