赞
踩
工作中,大多数时候会需要把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
- ;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。