hive 分離字符串中的數字&字母


需求

有一個字段有字母和數字組成,現要將字母和數字進行分離;

portyarn8088manager
porthdfs9820filse
porthive10000query

要求輸出結果

portyarn8088manager    portyarnmanager    8088
porthdfs9820filse    porthdfsfilse    9820
porthive10000query    porthivequery    10000
select 'porthdfs9820filse' port_info
      union
      select 'porthive10000query' port_info
      union
      select 'portyarn8088manager' port_info

思路

解題在於把不同字符和數字替換成一個指定的特征字符,這樣可以將一個字符就替換所有的字符,一個特征數字就可以代表所有的數字,在刪除數據的時候,無需逐一查找多個字符或多個數字了。

1、將特征字段替換成指定字符
select port_info,
       translate(lower(port_info), 'abcdefghijklmnopqrstuvwxyz', repeat('#', 26)) temp_info_1,
       translate(lower(port_info), '0123456789', repeat('&', 10))                 temp_info_2
from (select 'porthdfs9820filse' port_info
      union
      select 'porthive10000query' port_info
      union
      select 'portyarn8088manager' port_info) t;.

結果如下

 porthdfs9820filse    ########9820#####    porthdfs&&&&filse
porthive10000query    ########10000#####    porthive&&&&&query
portyarn8088manager ########8088#######    portyarn&&&&manager
2、通過正則,將特定字符刪除 
select port_info,
       regexp_replace(temp_info_2, '\\&', '') alb,
       regexp_replace(temp_info_1, '\\#', '') zm
from (select port_info,
             translate(lower(port_info), 'abcdefghijklmnopqrstuvwxyz', repeat('#', 26)) temp_info_1,
             translate(lower(port_info), '0123456789', repeat('&', 10))                 temp_info_2
      from (select 'porthdfs9820' port_info
            union
            select 'porthive10000' port_info
            union
            select 'portyarn8088' port_info) t) t;

結果

porthdfs9820    porthdfs    9820
porthive10000    porthive    10000
portyarn8088    portyarn    8088  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM