2019独角兽企业重金招聘Python工程师标准>>>

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 `下单记录流水表`) tGROUP BY t.`下单人ID`, t.`下单渠道`) t1LATERAL VIEW EXPLODE(array(t1.`下单渠道`, '不限')) t2 AS `下单渠道`GROUP BY t1.`下单人ID`, t2.`下单渠道`
) tt
GROUP BY tt.`下单渠道`

4.2 数组是否相等

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

4.2.1 考虑顺序是否一致

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

4.2.2 不考虑顺序是否一致

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

原文链接

转载于:https://my.oschina.net/u/1464083/blog/3019854

maxcompute 2.0复杂数据类型之array相关推荐

  1. maxcompute 2.0复杂数据类型之struct

    1. 含义 类似于Java中的类的概念.包含很多类的属性. 2. 场景 什么样的数据,适合使用struct类型来存储呢?这里列举了几个我在开发中实际用到的场景. 2.1 多个具有相同前缀的字段 其实s ...

  2. Python-3.7.0常用数据类型源码—列表

    Python-3.7.0常用数据类型源码-列表 list源码: /* List object implementation */#include "Python.h" #inclu ...

  3. MaxCompute 2.0—从ODPS到MaxCompute

    从ODPS到MaxCompute-阿里大数据的进化之路是一个商用大数据系统发展史,一个商业大数据系统要解决的问题有可靠性,高性能,安全性等等六个方面.内部产品名ODPS的MaxCompute,是阿里巴 ...

  4. 如何申请试用MaxCompute 2.0

    MaxCompute 2.0 上线以来很多同学都在询问如何才能获取试用资格.在这里向大家简要介绍MaxCompute 2.0发布的功能,申请方式及如何使用. 大数据计算服务(MaxCompute) 快 ...

  5. 【Java常识】10.0 基本数据类型的自动装箱、拆箱、正则表达式

    1.0 基本数据类型有专门的包,这算是很常识了.但是有个小知识点,就是涉及自动装箱拆箱. 代码演示如下: package edp.com.learn1;public class Demo {publi ...

  6. MySQL 8.0 JSON数据类型与MyBatis结合使用

    前言 MYSQL 8.0 JSON数据类型基础应用 1.表 CREATE TABLE `tk_test_json` (`id` varchar(100) CHARACTER SET utf8mb3 C ...

  7. Hive 0.13 数据类型

    hive支持的数据类型路下 数值类型 Numeric Types TINYINT (1字节,数据范围: -128 to 127) SMALLINT (2字节,数据范围: -32,768 to 32,7 ...

  8. hive复合数据类型之array

    概述 ARRAY:ARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问.比如有一个ARRAY类型的变量fruits,它是由['apple','orange','mango']组成 ...

  9. js中for(i in array)和for(i=0;i<array.length;i++)之间的坑

    前情提要 刚刚接触到js写for循环的时候,觉得for(i in array)这种格式简直是非常直观,比三段论的for循环好写得多.直到遇到了一个坑,事情是这样的: 最开始的网页中,鉴于方便,清一色使 ...

最新文章

  1. c语言从stdin读入
  2. 将多个图片转换成PDF文件-img2pdf
  3. python的构建工具setup.py
  4. 企业网络推广专员浅析企业网络推广初期网站优化应重视的一些问题
  5. python语言实例-Python语言实现百度语音识别API的使用实例
  6. PAT1043 输出PATest (20 分)
  7. ROR中简单的数据操作
  8. 关于final、finally、finalize
  9. 杨澜给80后女孩子的14个忠告
  10. keepalived高可用
  11. 163邮箱如何注册呢?
  12. C# 检测USB是否插入
  13. GCD中dispatch_semaphore(信号量)的使用方法
  14. 基础30讲 第六讲 中值定理
  15. DBeaver执行.sql脚本报错:ERROR 1064 (42000) at line 1
  16. ftp服务器修改pasv,ftp服务器修改pasv
  17. 实时传输协议——RTP协议
  18. 物联网设备数据流转之数据如何存储:TDengine集成SpringBoot, MyBatisPlus实现ORM与CRUD
  19. 好记性不如烂笔头——C++篇
  20. 终于知道为什么片子太多会导致硬盘变慢了

热门文章

  1. qt创建右键菜单,显示在鼠标点击处
  2. Python bytes 和 string 相互转换 - Python零基础入门教程
  3. 小皮面板有php环境吗,体验phpStudy小皮面板创建LAMP/LNMP系统和建站图文
  4. python用outlook自动发邮件_python使用两种发邮件的方式smtp和outlook示例
  5. 雨课堂显示服务器无法连接,雨课堂用的什么云服务器
  6. centos系统服务器关机,centos 7 重启服务器
  7. java and dsl_Groovy语法糖以及DSL
  8. 用计算机求函数公式,计算机常用的函数公式有哪些?
  9. idea html 错误提示,Idea 代码编辑错误不飘红提示
  10. mysql 导入 sqlite_Mysql 数据导入SQlite