多值列用于表示一个列中(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。
在文档使用中是否遇到以下问题
更多建议
匿名提交