今天也要学习呐 2022-08-26 18:24 采纳率: 68.2%
浏览 40
已结题

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

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

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

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

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

见SQL代码

  • 写回答

2条回答 默认 最新

  • 爱吃苦瓜的猿 2022-08-26 21:29
    关注

    这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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月6日
  • 已采纳回答 8月29日
  • 创建了问题 8月26日

悬赏问题

  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真