前言
在数据存储时研发端经常为了方便很多字段为了冗余存储了文本格式:json或者固定分隔符,但是数仓和数据分析在处理的时候又要进行取出单独的某个字段,进行使用,本文会详解下平时在工作中遇到的问题与处理办法。
字符串固定分隔符处理
案例:
字符串以:|*|分隔,k-v以:分隔,取出其中scene_ids字段值
字符串:
|*|cityId:201|*|qId:4890f057-8c8d-4fd6-8029-9ec8a374ab3b|*|st:poi|*|sId:62778388|*|scene_ids:6,0|*|pos:0|*|hId:92091235|*|Tp:default|*|page_index:0|*|page_size:20|*
测试表:
with tab as (
select
'|*|cityId:201|*|qId:4890f057-8c8d-4fd6-8029-9ec8a374ab3b|*|st:poi|*|sId:62778388|*|scene_ids:6,0|*|pos:0|*|hId:92091235|*|Tp:default|*|page_index:0|*|page_size:20|*|' as cl_name
)
方法一:正则表达处理
regexp_extract(str, regexp[, idx])
str是被解析的字符串或字段名
regexp 是正则表达式
idx是返回结果 取表达式的哪一部分 默认值为1。
0表示把整个正则表达式对应的结果全部返回
1表示返回正则表达式中第一个() 对应的结果 以此类推
注:使用标识符是需要\转义,比如正则数字\d需要使用\d
select cl_name,regexp_extract(cl_name,'scene_ids:(\\d+)',1) as scene_ids from tab
结果:
scene_ids
6
方法二:先转化成map再取key
str_to_map(text[, delimiter1, delimiter2])
Delimiter1将文本分成K-V对,Delimiter2分割每个K-V对。
对于delimiter1默认分隔符是’,’,对于delimiter2默认分隔符是’=’
select cl_name,str_to_map(cl_name,'\\|*\\|',':')['scene_ids'] as scene_ids from tab
结果:
scene_ids
6,0
方法三:使用split分隔函数
split(string str, string pat)
返回值: array 说明: 按照pat字符串分割str,会返回分割后的字符串数组
select cl_name,split(cl_name,