问题遇到的现象和发生背景
如何用hiveSQL把以下数据分开呢?
问题相关代码,请勿粘贴截图
--数据原样:A{98256}|B{12345}
--希望得到的结果:
A 98256
B 12345
--数据原样:钱款(用途:购物{73829}扣款)
--希望得到的结果:
类型 钱款
用途 购物
编码 73829
结果 扣款
我想要达到的结果
见SQL代码
如何用hiveSQL把以下数据分开呢?
--数据原样:A{98256}|B{12345}
--希望得到的结果:
A 98256
B 12345
--数据原样:钱款(用途:购物{73829}扣款)
--希望得到的结果:
类型 钱款
用途 购物
编码 73829
结果 扣款
见SQL代码
这2个题目都需要用到了hive的正则表达式和数组展开功能
第一个sql
select regexp_extract(record,'([A-Z])\\{(\\d+)\\}',1) as f1,
regexp_extract(record,'([A-Z])\\{(\\d+)\\}',2) as f2
from
(
select 'A{98256}|B{12345}' as source_str
) t
lateral view explode(split(source_str,'\\|')) t1 as record
;
第二个sql
select kv[0] as type_key, kv[1] as type_value
from
(
select
array(
array("类型", regexp_extract(record,"([^(]+)(.*",1) ),
array("用途", regexp_extract(record,".*:([^\\{]+)\\{.*",1) ),
array("编码", regexp_extract(record,".*\\{(\\d+)\\}.*",1) ),
array("结果", regexp_extract(record,".*\\}([^)]+))",1) )
) as kvs
from
(
select "钱款(用途:购物{73829}扣款)" as record
) t
) tt
lateral view explode(kvs) tt1 as kv
;