背景
业务开展新活动,活动规则中有阶梯奖励,即:达到某个区间,奖励对应的金钱。
如:
成交1单,每单奖励0元;
成交2-4单,每单奖励100元;
成交5单以上,每单奖励200元;
业务库中以字符串的形式存放活动规则,举例如下:
[{"min":1,"money":0,"max":1},{"min":2,"max":4,"money":100},{"min":5,"money":200,"max":99999}]
解析思路
如果要按照某人成交单数,计算出应得奖励,则需要把上面的字符串解析为3列:min、max、money。用成交单数分别和min、max比较,如果恰好">=min" 且 “<=max”,则取对应的money作为奖励。所以重点就在于如果解析上面的字符串为3行3列,类似如下:
min | max | money |
---|---|---|
1 | 1 | 0 |
2 | 4 | 100 |
5 | 99999 | 200 |
第一步:去掉无用的字符,字符两端的[{
和}]
,以及中间的"
,得到如下字符串:
min:1,money:0,max:1},{min:2,max:4,money:100},{min:5,money:200,max:0
第二步:使用},{
分隔,并结合lateral view explode
函数把字符串"炸开"为三行:
str |
---|
min:1,money:0,max:1 |
min:2,max:4,money:100 |
min:5,money:99999,max:200 |
第三步:最后再结合str_to_map
函数把每行映射为map,就可以取到对应的min,max以及money了。
SQL代码
with tmp as (
select '[{"min":1,"money":0,"max":1},{"min":2,"max":4,"money":100},{"min":5,"money":200,"max":99999}]' as col1
)
select
str_to_map(tmp_str, ',', ':')['min'] as min_num,
str_to_map(tmp_str, ',', ':')['max'] as max_num,
str_to_map(tmp_str, ',', ':')['money'] as money
from
(
select
regexp_replace(col1, '"|\\[\\{|\\}\\]', '') as col2
from tmp
) t1
lateral view explode (split(t1.col2, '\\},\\{')) a as tmp_str
总结
遇到需要解析的复杂字符串,首先要观察字符串的结构,并思考如何可以映射成hive常用的字符结构,当然前提是要对hive函数比较熟悉。