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 ;
id arr
xxx a
xxx b
xxx c

3.1.2 posexplode

select posexplode(t.arr) from (select array('a','b','c') as arr) t;
pos val
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 ;
id serialno arr
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 不考虑顺序是否一致

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

原文链接
本文为云栖社区原创内容,未经允许不得转载。

MaxCompute 2.0复杂数据类型之array的更多相关文章

  1. 数据类型总结——Array(数组类型)

    相关文章 简书原文:https://www.jianshu.com/p/1e4425383a65 数据类型总结——概述:https://www.cnblogs.com/shcrk/p/9266015. ...

  2. javascript数据类型之Array类型

    Array类型 除了Object之外,Array类型恐怕是ECMAScript中最常用的类型了.而且,ECMAScript中的数组与其他多数语言中的数组有着相当大的区别.虽然ECMAScript数组与 ...

  3. array(1) { [0]=> int(5) }和array(1) { [0]=> string(1) "5" }

    php array数组: $arrayValue = array(5); $arrayValue = array('5'); 的不同之处 一个是整型一个是字符串型 array(1) { [0]=> ...

  4. 【WXS数据类型】Array

    属性: 名称 值类型 说明 [Array].constructor [String] 返回值为“Array”,表示类型的结构字符串 [Array].length [Number] 返回数组长度 方法: ...

  5. 用 Spark 处理复杂数据类型(Array、Map、JSON字符串等)

    split 对列表进行切割,然后生产新的列表 from pyspark.sql.functions import split# 对 key列按照 0-9之间的数字进行风格 重新命名为 s  df.se ...

  6. 解析 Array.prototype.slice.call(arguments,0)

    Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...

  7. 【Redis3.0.x】数据类型

    Redis3.0.x 数据类型 五大数据类型 String(字符串) string 是 redis 最基本的类型.可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value. ...

  8. js Array.prototype.slice.call(arguments,0) 理解

    Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...

  9. MaxCompute - ODPS重装上阵 第六弹 - User Defined Type

    MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务. MaxCompute除了持续优化性能外,也致力于提 ...

随机推荐

  1. Python 内置的一些高效率函数用法

    1.  filter(function,sequence) 将sequence中的每个元素,依次传进function函数(可以自定义,返回的结果是True或者False)筛选,返回符合条件的元素,重组 ...

  2. Python《学习手册:第二章-习题》

    什么是Python解释器? Python解释器是运行Python程序的程序. 什么是源代码? 源代码是为程序所写的语句:它包括文本文件(通常以.py为文件名结尾)的文件. 什么是字节码? 字节码是Py ...

  3. 利用JavaScriptSerializer转json实用方法

    项目中经常碰到需要输出的是json数据,使用JavaScriptSerializer转换,以前老的方法如下. JavaScriptSerializer jss = new JavaScriptSeri ...

  4. codeforces 983B XOR-pyramid

    题意: 定义一个函数f(a): 给出一个数组a,有q个询问,每次询问回答在l到r的区间内,连续子串的f函数的最大值. 思路: 画图,来自codeforces SheepRanger 由此图可知,f(l ...

  5. macbook 添加快捷启动服务

    来至 Mac OS X: Launch Terminal from keyboard shortcut os x 上很多功能都可以通过Apple自家的Automator.app创建,且使用此方法可以为 ...

  6. JAVA远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)

    RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成&qu ...

  7. libevent库简单使用

    一.libevent库简介 Libevent是一个用于开发可扩展性网络服务器的基于事件驱动(event-driven)模型的网络库.Libevent有几个显著的亮点: (1)事件驱动(event-dr ...

  8. 【线程系列五】什么时候释放锁—wait()、notify()

    由于等待一个锁定线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不需要锁的时候及时释放锁是很重要的.在以下情况下,持有锁的线程会释放锁:    1. 执行完同步代码块.    2. 在执行 ...

  9. 解决fatal error LNK1168的终极方法

    很多人的VC++或Visual studio 会出现fatal error LNK1168错误很是头疼,MS也说不清, 什么改权限.用户名.注册表.CMD,卸载杀毒软件...一切都瞎扯,除非reins ...

  10. Asp.net MVC + Redis(hash入库+log4net集成)

    博客四元素 既然要写一个博客类的网站,那就应该知道博客的相关信息. 标题 作者 时间 内容 title author time content 因为之前有了解过Redis,所以有点纠结于数据的存储方式 ...