1、通常情况下,hive中字符串的截取有substr/substring可以使用。
语法: substr(string A, int start, int len),substring(string A, intstart, int len),用法一样,三个参数
返回值: string
说明:返回字符串A从start位置开始,长度为len的字符串
但hive中没有字符串位置函数,这样对于较为复杂的截取,要么写UDF函数,否则无能为力。
2、但我们可以借用split函数,实现所需字段的提取。
hive字符串分割函数
split(str, regex) - Splits str around occurances that match regex
split函数将字符串分割成List,然后取出自己想要的部分即可。另外,regex分割符可以是字符串,再结合concat等字符串函数,就使得我们在hive上进行字符串截取时为所你欲为。
示例(提取推送文本中的链接):
select content,split(concat('http',split(content,'http')[1]),'\"|\退\订')[0] url
from dwt.mess_send_log_full_1d;
结果示例:
<p>本调查为匿名形式,建议您填选的内容尽可能真实有效。为感谢您对本次调查活动的支持,填选者将有机会获赠100元平台无门槛优惠券。<a href="https://www.wjx.cn/jq/30277949.aspx" target="_blank">详情请戳>></a></p> https://www.wjx.cn/jq/30277949.aspx
<p>限时福利,仅少数人可见,参与调研即有机会获得100元无门槛优惠券。<a href="https://www.wjx.cn/jq/30277949.aspx" target="_blank">详情请戳>></a></p> https://www.wjx.cn/jq/30277949.aspx
<p>限时福利,仅少数人可见 ! 参与调研即有机会获得100元无门槛优惠券。<a href="https://www.wjx.cn/jq/30331424.aspx" target="_blank">详情请戳>></a></p> https://www.wjx.cn/jq/30331424.aspx
春风堂针对钱币类目全面上线已鉴定拍品的加权,并针对优质拍品进行前置曝光展现,详情点击:http://t.cn/EZBmaHC http://t.cn/EZBmaHC
春风堂针对钱币类目全面上线已鉴定拍品的加权,并针对优质拍品进行前置曝光展现,详情点击:http://t.cn/EZBmaHC http://t.cn/EZBmaHC
3、更正:
hive中是存在位置查找函数【instr】的。可能是没有耐心查找资料,造成谬误。
instr(string str, string substr)
查找字符串str中子字符串substr出现的位置,如果查找失败将返回0,如果任一参数为Null将返回null,注意位置为从1开始的。
示例:
select substr('abc(123)',1,instr('abc(123)','(')-1),
substr('abc(123)',instr('abc(123)','(')+1,instr('abc(123)',')')-instr('abc(123)','(')-1);
OK
abc 123
Time taken: 0.048 seconds, Fetched: 1 row(s)
另外,instr也支持字符串在字符串中位置的查找:
hive> select instr('abc(123)','124'),instr('abc(123)','123');
OK
0 5
Time taken: 0.148 seconds, Fetched: 1 row(s)