hive正常数据转化为json数组

13 篇文章 2 订阅
12 篇文章 0 订阅

       

 

        工作中,大多数时候会需要把json数组中的数据解析出来,现在会经常和后端打交道,后端同学就希望把正常的行列数据用json的形式给他们,他们使用起来方便,我看有的文章会写用udtf函数实现,不过本着能用内置函数绝不用自定义函数的原则(主要是我不会写),用内置函数实现也不是很难。

       原数据形式:

       希望转换成一个标准的json数组,

{
  下装款型: {
    直筒裤
  },
  下装设计: {
    纯色
  },
  厚度: {
    正常
  },
  版型: {
    正常
  },
  穿搭风格: {
    机能,
    休闲
  },
  裤长: {
    长裤
  },
  颜色: {
    褐,
    灰
  }
}

简单的hive实现:

--我用的是阿里云的odps,hive略微有点差别
--tmp为原始数据表
--goods_name和tag_name为需要处理的字段
select 	goods_id
        ,concat('{',wm_concat(',',concat(goods_name,':',tag_name)),'}') as tag_detail
from	(
            select 	goods_id
                    ,goods_name
                    ,concat('{',wm_concat(',',tag_name),'}') as tag_name
            from	(
                        select 	goods_id
                                ,goods_name
                                ,tag_name
                        from	tmp
                    ) t0
            group by goods_id
                        ,goods_name
        ) t1
group by goods_id
;

上面的还是太简单了,这次碰到了麻烦点的,特别记录下,看有用udf实现的,下次试下,优先还是内置函数吧,稳定且效率高

select  concat(
            '{"id":"'
            ,goods_supplier_id
            ,'","size":'
            ,size
            ,',"performance":'
            ,if(compliance_prefee_rate is null,'\"\"',compliance_prefee_rate)
            ,'}'
        ) as value
from    (
            select  goods_supplier_id
                    ,concat(
                        "{"
                        ,concat_ws(
                            ','
                            ,collect_set(concat_ws(':',t1.size,cast(t1.score as string)))
                        )
                        ,'}'
                    ) as size
                    ,t2.compliance_prefee_rate
            from    (
                        select  goods_supplier_id
                                ,shop_id
                                ,concat('"',size,'"') as size
                                ,score
                        from    bigdata2c.dm_goods_supplier_rank_new_d
                        where   dt = ${bdp.system.bizdate}
                    ) t1 left
            join    (
                          select  shop_id
                                  ,compliance_prefee_rate
                          from    bigdata2c.ba_shop_compliance_prefee_rate
                      ) t2
            on      t1.shop_id = t2.shop_id
            group by t1.goods_supplier_id
                     ,t2.compliance_prefee_rate
        ) t0
;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值