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除了持续优化性能外,也致力于提 ...
随机推荐
- 学习ASP.NET Core Razor 编程系列九——增加查询功能
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- my views--软件工程、python
这是大三第二学期开的一门课,由吴世枫老师和王韬助教教的. 大一开了C语言,大二开了java.matlab,而用得最多的应该是学java顺便学会的C++了.matlab在实训和数学建模用了多次,尤其是数 ...
- composer安装laravel指定版本
版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog.csdn.net/qq_38125058/article/details/79126051 首先安装composer,附安 ...
- 解决Ubuntu系统下的VMware Workstation无法打开虚拟网络编辑器界面的问题
本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=630 操作环境: Ubuntu 17 VMware 14 pro for Linux 问题描述: 我在Ubuntu ...
- TSL1401线性CCD TM32F103开发平台移植源代码
Technorati Tags: stm32 模块资料 对于线性CCD而言,开发着更多的是基于飞思卡尔系列单片机进行开发,前几天在做项目的时候需要用到该传感器,故使用了蓝宙CCD的驱动历程,然后对蓝宙 ...
- CORS 实战 专题
本文会代码层面对CORS问题进行剖析 CORS相关相关概念可参考http://www.cnblogs.com/softidea/p/5496719.html ERROR info: XMLHttpRe ...
- 进击Node.js基础(一)
一.前言 1:Node.js本质上是用chrome浏览器 v8引擎 使用c++编写的JS运行环境 2:相比于JS没有浏览器安全级的限制,额外提供了一些系统级的API:文件读写,进程管理,网络通信等. ...
- jQuery学习之旅 Item3 属性操作与样式操作
本节将Dom元素的操作:属性操作.样式操作.设置和获取HTML,文本和值.Css-Dom操作. 1.属性操作 <input type="text" name="us ...
- 19.最省钱的app发短信方法
在创业团队中,一个重要的原则是能省就省,该花就花,把银子用在刀刃上. 现在的app,为了获取用户的社交关系,需要用户的手机号注册.用手机号注册就涉及到一个发送短信验证码的问题,那怎么才能在短信服务上投 ...
- BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针
BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针 Description Farmer John's N cows (1 <= N <= 100,000) ...