关于#hive#的问题,如何解决?

问题遇到的现象和发生背景

如何用hiveSQL把以下数据分开呢?

问题相关代码,请勿粘贴截图
--数据原样:A{98256}|B{12345}
--希望得到的结果:
A  98256
B  12345

--数据原样:钱款(用途:购物{73829}扣款)
--希望得到的结果:
类型   钱款
用途   购物
编码   73829
结果   扣款
我想要达到的结果

见SQL代码

这2个题目都需要用到了hive的正则表达式和数组展开功能

第一个sql

  • 用split把字符串展开成数组
  • 用lateral view explode把数组展开成多行
  • regexp_extract 从字符串中匹配出目标
    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
    ;
    

img

第二个sql

  • regexp_extract 从字符串中匹配出目标
  • 拼装成一个二维数组
  • 用lateral view explode把数组展开成多行
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
;

img

哎,错过了