• maxcompute 2.0复杂数据类型之array


    1. 含义

    类似于Java中的array。有序、可重复。

    2. 场景

    什么样的数据,适合使用array类型来存储呢?这里列举了几个我在开发中实际用到的场景。

    2.1 标签类的数据

    为什么说标签类数据适合使用array类型呢?
    (1)标签一般是一个只有key、没有value的结构;
    (2)标签的数量(枚举值个数)会非常多;
    (3)标签的变化会比较频繁;
    (4)标签会过期;
    因此,比起“创建多个字段”、“使用指定分隔符分隔的字符串”、“使用map”等方法,使用array是更合适的。

    2.2 对象列表

    对象有多种固定的属性,简单的key-value格式无法满足,可以使用array嵌套struct的方式定义。减少了维护数据字典的工作量。

    3. 玩转array

    3.1 数组字段拆成多行

    3.1.1 explode

    select explode(t.arr) from (select array('a','b','c') as arr) t;
    
    
    col
    a
    b
    c
    select t1.id,t2.arr from (select 'xxx' as id,array('a','b','c') as arr) t1 lateral view explode(t1.arr) t2 as arr ;
    
    
    idarr
    xxx a
    xxx b
    xxx c

    3.1.2 posexplode

    select posexplode(t.arr) from (select array('a','b','c') as arr) t;
    
    
    posval
    0 a
    1 b
    2 c
    select t1.id,t2.serialno,t2.arr from (select 'xxx' as id,array('a','b','c') as arr) t1 lateral view posexplode(t1.arr) t2 as serialno,arr ;
    
    
    idserialnoarr
    xxx 0 a
    xxx 1 b
    xxx 2 c

    3.2 多行合并成数组

    3.2.1 不去重

    select collect_list(t.c1) as arr from ( select 'a' as c1 union all select 'a' as c1 union all select 'b' as c1) t;
    
    
    arr
    ["a","a","b"]

    3.2.2 去重

    select collect_set(t.c1) as arr from ( select 'a' as c1 union all select 'a' as c1 union all select 'b' as c1) t;
    
    
    arr
    ["a","b"]

    3.3 数组拼成字符串

    select concat_ws(',',t.arr) from (select array('a','b','c') as arr) t;
    
    
    _c0
    a,b,c

    3.4 字符串转成数组

    select split('a,b,c',',');
    
    
    _c0
    ["a","b","c"]

    3.5 构造数组

    select array('aa','bb','cc');
    
    
    _c0
    ["aa","bb","cc"]

    3.6 数组元素排序

    select sort_array(array('b','c','e','a','d'));
    
    
    _c0
    ["a","b","c","d","e"]
    select sort_array(array(1,10,100,2,3));
    
    
    _c0
    [1,2,3,10,100]

    3.7 数组中增加一项

    select split(concat('d,',concat_ws(',',t.arr)),',') as arr from (select array('a','b','c') as arr) t;
    
    
    arr
    ["d","a","b","c"]

    4. 常见用法

    4.1 代替无法使用的with cube

    例如现在有张下单记录流水表,记录着每一条下单记录,包含字段“订单ID”、“下单人ID”、“下单渠道(网站/app)”。
    现在要统计“各渠道的下单人数和订单数”,渠道维度包含“不限”、“网站”、“APP”三项。
    一般做这些包含“不限”的维度的聚合计算时,都使用group by xxx with cube关键字。但是maxcompute中暂时还不支持这个关键字,所以我们换另一种方法来实现。

    SELECT tt.`下单渠道`, COUNT(1) AS `下单人数`, SUM(tt.`下单量`) AS `下单量`
    FROM (
        SELECT t1.`下单人ID`, t2.`下单渠道`, SUM(t1.`下单量`) AS `下单量`
        FROM (
            SELECT t.`下单人ID`, t.`下单渠道`, SUM(t.`下单量`) AS `下单量`
            FROM (
                SELECT `订单ID`, `下单人ID`, `下单渠道`, 1 AS `下单量`
                FROM `下单记录流水表`
            ) t
            GROUP BY t.`下单人ID`, 
                t.`下单渠道`
        ) t1
            LATERAL VIEW EXPLODE(array(t1.`下单渠道`, '不限')) t2 AS `下单渠道`
        GROUP BY t1.`下单人ID`, 
            t2.`下单渠道`
    ) tt
    GROUP BY tt.`下单渠道`
    
    

    4.2 数组是否相等

    数组的相等或不等,无法通过“=”来判断,因此要尝试一些其他的方法。最常用的办法,就是转成字符串再比较。

    4.2.1 考虑顺序是否一致

    直接转成字符串后,比较是否相等

    4.2.2 不考虑顺序是否一致

    先排序,再转成字符串,然后比较是否相等

     

     

    原文链接
    更多技术干货 请关注阿里云云栖社区微信号 :yunqiinsight

  • 相关阅读:
    绍一集训Round#2
    CF 799B T-shirt buying
    Luogu P2827 蚯蚓
    Luogu P4053 [JSOI2007]建筑抢修
    【LGR-049】洛谷7月月赛
    浅谈可持久化数据结构
    CF 888E Maximum Subsequence
    在平衡树的海洋中畅游(三)——Splay
    浅谈单调栈/队列
    CF 859E Desk Disorder
  • 原文地址:https://www.cnblogs.com/zhaowei121/p/10496985.html
Copyright © 2020-2023  润新知