工作中,大多数时候会需要把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
;

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐