全部產品
Search
文件中心

AnalyticDB:Map

更新時間:Nov 05, 2024

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>