如何将hive中字符串解析(字符串的连接、解析)

场景:(1)将表中的字段转化成json数组,合并列,然后再合并行。建测试表,1315 、11729为表中某字段的值分属于不同的行,123、456为另一字段的对应行数字。准备测试数据,样例如下:[{"c1":"1315","c2":"123"},{"c1":"11729","c2":"456"}]。(2)将上述样例解析为表中的字段值1315、123。

1.准备测试数据的方法:

1)用:连接

select concat_ws(':','c1',a) from b   

结果如下:

c1:1672
c1:5025
c1:12218

……

2)加上双引号

select concat(',',concat('\"','c1','\"'),':',concat('\"',a,'\"')) kv from b

结果如下:

"c1":"1672"
"c1":"5025"
"c1":"12218"

3)加[{

SELECT CONCAT('{[',CONCAT(CONCAT('\"','c1','\"'),':',CONCAT('\"',a,'\"')),',',CONCAT(CONCAT('\"','c2','\"'),':',CONCAT('\"',nvl(b,''),'\"')),']}') FROM c

结果如下:

{["c1":"1672","c2":"14227"]}
{["c1":"12473","c2":""]}

4)合并行(如果有多个字段,将多个字段group,需注意group的字段里面维度不同导致合并不出想要的结果)

SELECT
        id,
        CONCAT ('[',CONCAT_WS(',',collect_set(kw)),']') AS kw
       FROM
           (SELECT
              medal_id,
              CONCAT(
               '{'
               ,CONCAT(
                 CONCAT(CONCAT('\"', 'c1', '\"'),':',CONCAT('\"', a, '\"')),
                 ',',
                 CONCAT(CONCAT('\"', 'c2', '\"'),':',CONCAT('\"', nvl (b, ''),'\"')))
               ,'}') AS kw

           FROM   a    GROUP BY id;

结果如下:

[{"c1":"6233","c2":"6260"},{"c1":"6233","c2":"6264"}]

综上,测试数据准备完成。

2.解析json字符串:

存储的数据类型是string,方法如下:先把[去掉,然后把分隔符编程||,然后一行变多行。

1)去掉[用如下:   '^\\[(.+)\\]$',1),'\\}\\,\\{'   , 将分隔符改成|| 用如下: '\\}\\|\\|\\{',分别用正则表达式函数regexp_extract(str, regexp[, idx]) 

select regexp_replace(regexp_extract(dddd,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{') as kw from test_002;

结果如下:

{"c1":"12218","c2":""}
{"c1":"13314","c2":""}||{"c1":"9192","c2":""}

2)一行变多行

SELECT a.id,b.kws,c.first,c.second FROM 
     (SELECT id, split(regexp_replace(regexp_extract(dddd,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|') AS kw  
     FROM test_002 )a
    LATERAL VIEW explode(a.kw)b AS kws       -----把一行变成多行
    LATERAL VIEW json_tuple(b.kws,'c1','c2') c AS c1,c2;     --------把c1,c2从字符串中解析出来。

结果如下:

100006    {"c1":"16","c2":"14"}    1672    14227
100006    {"c1":"473","c2":""}    473    

 

2.sql跑和在shell(或者hive -e)执行:hive -e 中执行转义字符\\改成\\\\,试验不可以,然后再修改转义字符\\\\\\,示例如下:

SELECT
    id,
    split (
      regexp_replace (
        regexp_extract(cate_condition, '^\\\\\\[(.+)\\\\\\]$', 1),
        '\\\\\\}\\\\\\,\\\\\\{','\\\\\\}\\\\\\|\\\\\\|\\\\\\{'
      ),
      '\\\\\\|\\\\\\|'
    ) AS kw

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学习指南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值