如何保证hive collect_set 元素是有序的

背景:开发过程中遇到一个场景,就是要保证拼接起来的json是按照json里的某个字段排序的,我们这里是按照省市的数量来保证拼接起来的json是倒序的,我先展示下结果,以便于理解:

{
    "name": "广东",
    "number": 9999999,
    "value": [
        113.264434,
        23.129162
    ]
},
{
    "name": "安徽",
    "number": 999998,
    "value": [
        117.283042,
        31.861190
    ]
},
{
    "name": "河南",
    "number": 34565,
    "value": [
        113.624946,
        34.747040
    ]
},

拼接起来的json是按照number来倒序的。

本着可以用sql解决的事情就不要用别的语言来解决,否则会增加解决问题的复杂度,这里就用到了collect_set ,但是有个问题就是collect_set 拼接起来的数据是无序的,无法保证顺序,所以这里就要结合distribute by 和 sort by 一起来解决问题。上代码:

select 
    concat_ws(',',collect_set(strs))
from 
(select 
    cnt,
    strs
from 
(select 
    cnt ,
    concat('{','\"name\":','\"',province,'\"',',','\"number\":',cnt,',','\"value\":','[',longitude,',',latitude,']','}') as strs
from tblname 
order by cnt desc)t1   --先做了一次排序了已经
    distribute by strs
    sort by cnt desc )t2
;

以上仅供参考~

你可能感兴趣的:(hive,数据仓库)