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 ;
| 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的更多相关文章
- 数据类型总结——Array(数组类型)
相关文章 简书原文:https://www.jianshu.com/p/1e4425383a65 数据类型总结——概述:https://www.cnblogs.com/shcrk/p/9266015. ...
- javascript数据类型之Array类型
Array类型 除了Object之外,Array类型恐怕是ECMAScript中最常用的类型了.而且,ECMAScript中的数组与其他多数语言中的数组有着相当大的区别.虽然ECMAScript数组与 ...
- array(1) { [0]=> int(5) }和array(1) { [0]=> string(1) "5" }
php array数组: $arrayValue = array(5); $arrayValue = array('5'); 的不同之处 一个是整型一个是字符串型 array(1) { [0]=> ...
- 【WXS数据类型】Array
属性: 名称 值类型 说明 [Array].constructor [String] 返回值为“Array”,表示类型的结构字符串 [Array].length [Number] 返回数组长度 方法: ...
- 用 Spark 处理复杂数据类型(Array、Map、JSON字符串等)
split 对列表进行切割,然后生产新的列表 from pyspark.sql.functions import split# 对 key列按照 0-9之间的数字进行风格 重新命名为 s df.se ...
- 解析 Array.prototype.slice.call(arguments,0)
Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...
- 【Redis3.0.x】数据类型
Redis3.0.x 数据类型 五大数据类型 String(字符串) string 是 redis 最基本的类型.可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value. ...
- js Array.prototype.slice.call(arguments,0) 理解
Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...
- MaxCompute - ODPS重装上阵 第六弹 - User Defined Type
MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务. MaxCompute除了持续优化性能外,也致力于提 ...
随机推荐
- 关于css盒模型
在css中,width和height指的是内容区域的宽度和高度.增加内边距,边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸.假设框的每个边上有10个像素的外边距和5像素的内边距,如果希望 ...
- django-团队简介的网页
团队简介的网页,是使用Django完成的 关于Django的教程网址:http://www.runoob.com/django/django-tutorial.html 小组作业成果如下:
- WebApiClient库支持AOT
1 库简介 WebApiClient是开源在github上的一个http客户端库,内部基于HttpClient开发,只需要定义c#接口(interface),并打上相关特性,即可异步调用http-ap ...
- Effective Java 第三版——42.lambda表达式优于匿名类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- CF#483(div2 C)
http://codeforces.com/contest/984/problem/C C. Finite or not time limit per test 1 second memory lim ...
- 如何识别企业内的“千里马”?
很多企业主都在感叹无法找到合适的优秀管理人才,却忽视了一条获得管理人才的捷径:内部培养.在员工中挑选具有领导潜质的人才,加以培养,必成企业栋梁,而且这样选拔的人才与企业的契合度.忠诚度方面都相对较高. ...
- Java NIO Channel通道
原文链接:http://tutorials.jenkov.com/java-nio/channels.html Java NIO Channel通道和流非常相似,主要有以下几点区别: 通道可以读也可以 ...
- 剑指Offer_编程题之重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- android与js的交互之jsbridge使用
众所周知,app的一些功能可能会使用到H5开发,这就难免会遇到java与js 的相互调用,android 利用WebViewJavascriptBridge 实现js和java的交互,这里介绍下JsB ...
- http cookie管理中cookie police下部分参数含意
1.compatibility:推荐选择此种策略.这种兼容性设计要求是适应尽可能多的不同的服务器,尽管不是完全按照标准来实现的.如果你遇到了解析 Cookies 的问题,你就可能要用到这一个规范. ...