maxcompute 2.0复杂数据类型之map

简介: 1. 含义和Java中的Map一样,多个Key-Value的组合。2. 场景什么样的数据,适合使用map类型来存储呢?这里列举了几个我在开发中实际用到的场景。2.1 数量不固定的多个KeyValue这类,本身就是Map类型的数据。

1. 含义

和Java中的Map一样,多个Key-Value的组合。

2. 场景

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

2.1 数量不固定的多个KeyValue

这类,本身就是Map类型的数据。例如:用户购买不同类目的商品个数、商家销往不同城市的商品个数等等。可能用户昨天之前没买过数码类商品、而今天就买了;也可能商家昨天之前没把东西卖到过深圳、而今天就有深圳的买家买了。所以KV对的个数是不固定的,无法用常规的字段固化下来,更合适采用Map来存储这类动态的数据。

2.2 标签类的数据

之前说过,标签类的数据适合用array存储,绝大部分情况下是合适的。
但是有些场景,例如数据分析展示到BI报表中,一般我们需要直接把标签展示成中文。而一般情况下,我们的标签都是通过“数字ID”或者“字母”来存储的。如果这类数据需要展示成中文,又要再额外关联一次字典表取得中文,每个统计任务都关联一次,就有点儿麻烦了。
所以这里建议,直接在基础数据表中,就把ID对应的中文保存起来。Map的key是“标签ID”、value是“标签中文”。用空间,换效率。

2.3 嵌套struct

之前说过,对象有多种固定的属性,简单的key-value格式无法满足,可以使用array嵌套struct的方式定义。
但是这类的array如果想解析,只能先全部展开,再拿到我们需要的部分。如果我们可以事先知道常用的检索条件,并且该字段唯一、不重复,就可以用map代替array。map的key就是我们常用的检索条件字段,value则是一个struct对象。

3. 玩转map

3.1 构造map

3.1.1 直接拼

SELECT map('k1','v1','k2','v2','k3','v3') AS c;
c
{"k3":"v3","k1":"v1","k2":"v2"}

这种直接拼成map的方法,需要开发自己去保证所有的key的类型一致、所有的value的类型一致,否则会报错。
但实际应用过程中,key和value一般都直接用string类型,简单粗暴。用的时候现去做类型转换。

3.1.2 将一定格式的字符串转为map

实际应用中,这种构造方法最为常见。默认,每个KV对之间的分隔符为英文逗号,K和V之间的分隔符为等号。

SELECT str_to_map('k1=v1,k2=v2,k3=v3') AS c;
c
{"k3":"v3","k1":"v1","k2":"v2"}

如果实际的分隔符不是逗号与等号,就需要传入实际的分隔符作为参数。

SELECT str_to_map('k1:v1;k2:v2;k3:v3',';',':') AS c;
c
{"k3":"v3","k1":"v1","k2":"v2"}

第二个参数为“每个KV对之间的分隔符”,第三个参数为“K和V之间的分隔符”。

3.2 查元素个数

SELECT size(str_to_map('k1=v1,k2=v2,k3=v3')) AS c;
c
3

3.3 取出所有Key

SELECT map_keys(str_to_map('k1=v1,k2=v2,k3=v3')) AS c;
c
["k1","k2","k3"]

3.4 取出所有Value

SELECT map_values(str_to_map('k1=v1,k2=v2,k3=v3')) AS c;
c
["v1","v2","v3"]

3.5 根据Key值取Value

SELECT str_to_map('k1=v1,k2=v2,k3=v3')['k3'] AS c;
c
v3

3.6 展开

主要有两种展开方式。一种是“只展开map”,即select后边只有展开后的map。

SELECT explode(str_to_map('k1=v1,k2=v2,k3=v3')) AS (c1,c2);
c1 c2
k1 v1
k2 v2
k3 v3

另一种是展开map的同时,还要带上其他字段。即select后边除了展开后的map之外,还有其他字段。

SELECT t1.id,t2.k,t2.v 
FROM (
SELECT 666 AS id,
str_to_map('k1=v1,k2=v2,k3=v3') AS c
) t1 
LATERAL VIEW EXPLODE(t1.c) t2 AS k,v;
id k v
666 k1 v1
666 k2 v2
666 k3 v3

4. 常见用法

  1. 使用map的时候,不要去过分纠结“字段类型”、“键值对的顺序”这类没有意义或者意义不大的问题。完全可以key和value都弄成字符串类型,顺序等到最后再去排;
  2. 列转行。常见的思路是,先把待转的列拼成一个map,再用explode展开;
  3. map类型不止用在数据存储上,还可以用在复杂SQL的中间过程中。主要和explode联用,做行列转化;
相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
存储 SQL 大数据
大数据技术之Clickhouse---入门篇---数据类型、表引擎
大数据技术之Clickhouse---入门篇---数据类型、表引擎
|
存储 分布式计算 大数据
MaxCompute数据类型映射
MaxCompute数据类型映射
|
SQL NoSQL Java
Redis学习---大数据技术之Redis(NoSQL简介、Redis简介、Redis安装、五大数据类型、相关配置、持久化)
Redis学习---大数据技术之Redis(NoSQL简介、Redis简介、Redis安装、五大数据类型、相关配置、持久化)
|
存储 SQL HIVE
数据仓库的Hive的数据类型的复杂数据类型的map
在数据仓库领域,Hive是一个常用的工具。它提供了一种简单的方式来查询和分析大量数据。
510 0
|
存储 SQL 分布式计算
大数据-135 - ClickHouse 集群 - 数据类型 实际测试
大数据-135 - ClickHouse 集群 - 数据类型 实际测试
284 0
|
SQL 分布式计算 资源调度
MaxCompute操作报错合集之执行SQL Union All操作时,数据类型产生报错,该怎么解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
415 1
|
存储 分布式计算 DataWorks
MaxCompute产品使用合集之要存储用户的下单所有产品,然后查询时要进行产品分组的,一般这种字段要使用ARRAY还是MAP
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
存储 分布式计算 关系型数据库
实时数仓 Hologres产品使用合集之创建外部表时提示不支持ODPS的datetime数据类型,该怎么解决
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
分布式计算 Java 调度
MaxCompute产品使用合集之使用Tunnel Java SDK上传BINARY数据类型时,应该使用什么作为数据类字节
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
163 0
|
SQL 分布式计算 DataWorks
MaxCompute数据之禁止数据流出如何解决
MaxCompute数据包含存储在MaxCompute服务中的表、分区以及其他数据结构;本合集将提供MaxCompute数据的管理和优化指南,以及数据操作中的常见问题和解决策略。
253 0

热门文章

最新文章

相关产品

  • 云原生大数据计算服务 MaxCompute