多值列用于表示一个列中(Cell)有多个不确定的值,一个多值列字段可以包含多种ADB支持的数据类型。一个表中可以定义一个或多个多值列,多值列可以作为筛选条件,也可以进行分组或者参与连接过滤等。

创建表

以下示例创建TEST1表,通过MULTIVALUE 定义tags字段为多值列,多值列之间以英文逗号(,)分隔,多值列中包含一个Varchar类型的字段value_type

CREATE TABLE test1 (
    user_id BIGINT,
    city VARCHAR,
    tags MULTIVALUE delimiter_tokenizer ',' value_type 'varchar'
)
DISTRIBUTED BY HASH (user_id)

写入数据

通过以下语句向TEST1表中写入三条数据。

insert into test1 values(1, 'HZ', 'A,B,C');
insert into test1 values(2, 'BJ', 'B,D');
insert into test1 values(3, 'SH', 'A,C,D,F');
select * from test1 order by user_id;
+---------+------+---------+
| user_id | city | tags    |
+---------+------+---------+
|       1 | HZ   | A,B,C   |
|       2 | BJ   | B,D     |
|       3 | SH   | A,C,D,F |

查询数据

  • 过滤查询

    通过以下语句查询TEST1表包含A、B标签的用户数。

    select count(*) from test1 where ref(tags,0) in ('A', 'B');
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |

    通过以下语句查询TEST1表中同时包含A和B标签的用户数目。

    select * from test1 where ref(tags,0) in ('A') and ref(tags,0) in ('B');
    +---------+------+-------+
    | user_id | city | tags  |
    +---------+------+-------+
    |       1 | HZ   | A,B,C |
  • 分组查询

    通过以下语句查询TEST1表中city不在杭州且标签为A或者B的用户在A、B标签下的人数。

    select ref(tags,0), count(*) from test1
    where ref(tags,0) in ('A', 'B') and city != 'HZ' group by ref(tags,0);
    +--------------+----------+
    | ref(tags, 0) | COUNT(*) |
    +--------------+----------+
    | A            |        1 |
    | B            |        1 |

    通过以下语句查询TEST1表中A标签或者B标签与其对应城市的联合分组。

    select ref(tags,0), city, count(*) from test1
    where ref(tags,0) in ('A', 'B') group by ref(tags,0), city;
    +--------------+----------+
    | ref(tags, 0) | COUNT(*) |
    +--------------+----------+
    | B            | BJ       |
    | B            | HZ       |
    | A            | SH       |
    | A            | HZ       |
  • 连接查询
    select count(*) from test1 join test
    on test1.user_id = test.id where ref(tags,0) in ('A', 'B') ;
    +----------+
    | COUNT(*) |
    +----------+
    |        0 |

注意事项

  • 多值列条件只能用于单表扫描条件,不能用于Join条件。
  • 当Group By分组中包含多值列时,Where条件中也必须包含多值列,否则ADB引擎底层会穷举所有多值列的value,影响ADB查询性能。
    说明 默认穷举1024个多值列value。