3.1.1及以后版本的AnalyticDB for MySQL集群支持Array、Map数据类型。本文介绍了Map数据类型的定义、注意事项及使用示例。

Map类型定义

Map类型,存储k-v键值对,含义类似Java中的Map。其中key类型要求是原生类型(如tinyintbooleansmallintintbigintfloatdoublestring),value类型可以是原生类型,也可以是Map或Array类型。例如,列定义map<int, string>map<int, map<int, string>>

注意事项

  • Array或Map列不支持构建索引,因此,在SQL查询语句中不建议直接过滤,需配合其他检索条件过滤。尽量减少scan数据量。

  • 针对一条Map记录,key不能重复。

  • 不保证key的写入顺序。比如写入时{"a":1,"b":2,"d":3},查询时结果为{"d":3, "a":1, "b":2}

使用示例

  • 创建表

    • Create Table `map_test` (
       `a` int,
       `b` map<int, string>,
       `c` map<int, map<int, string>>,
       PRIMARY KEY (`a`)
      ) DISTRIBUTED BY HASH(`a`)
  • 写入数据

    • 比如插入一行数据,其中b={1:"a"}, c={1:{11:"a"},2:{22:"b"}}

      INSERT INTO map_test VALUES(1, '{1:"a"}','{1:{11:"a"},2:{22:"b"}}');
  • 查询数据

    • SELECT * FROM map_test;
      +------+---------+-------------------------+
      | a    | b       | c                       |
      +------+---------+-------------------------+
      |    1 | {1:"a"} | {1:{11:"a"},2:{22:"b"}} |
      +------+---------+-------------------------+
      1 row in set (0.07 sec)
      重要
      • Map类型的根据key取值操作:element_at(b, 1),其中1表示key值,不是下标。

      • Map类型,size函数返回的是key、value的个数总和。

      • map_keysmap_values返回Array类型。

      SELECT element_at(c,1), element_at(element_at(c,1),11) FROM map_test;
      +-----------------+--------------------------------+
      | element_at(c,1) | element_at(element_at(c,1),11) |
      +-----------------+--------------------------------+
      | {11:"a"}        | a                              |
      +-----------------+--------------------------------+
      1 row in set (0.07 sec)
      
      SELECT map_keys(b),map_values(b),size(b),size(map_keys(b)),size(map_values(b)) FROM map_test;
      +-------------+---------------+---------+-------------------+---------------------+
      | map_keys(b) | map_values(b) | size(b) | size(map_keys(b)) | size(map_values(b)) |
      +-------------+---------------+---------+-------------------+---------------------+
      | [1]         | ["a"]         |       2 |                 1 |                   1 |
      +-------------+---------------+---------+-------------------+---------------------+
      1 row in set (0.08 sec)
      
      SELECT map_keys(c),map_values(c),size(c),size(map_keys(c)),size(map_values(c)) FROM map_test;
      +-------------+---------------------+---------+-------------------+---------------------+
      | map_keys(c) | map_values(c)       | size(c) | size(map_keys(c)) | size(map_values(c)) |
      +-------------+---------------------+---------+-------------------+---------------------+
      | [1,2]       | [{11:"a"},{22:"b"}] |       4 |                 2 |                   2 |
      +-------------+---------------------+---------+-------------------+---------------------+
      1 row in set (0.08 sec)

支持的函数

函数

描述

返回类型

element_at

根据key值,获取value。例如element_at(map(array["a","b"],array[1,2]), a) ==> 1

V

size

key个数与value个数总和。

int

map_keys

获取所有key列表。

array<K>

map_values

获取所有value列表。

array<V>