StarRocks 【新一代MPP数据库】(4)https://developer.aliyun.com/article/1534284
4.1.1、创建 Colocate 表
在建表时,需要在 PROPERTIES 中指定属性 "colocate_with" = "group_name" 以创建一个 Colocate Join 表,并且指定其归属于特定的 Colocation Group。
CREATE TABLE `tbl1` ( `k1` date NOT NULL COMMENT "", `k2` int(11) NOT NULL COMMENT "", `v1` int(11) SUM NOT NULL COMMENT "" ) ENGINE=OLAP AGGREGATE KEY(`k1`, `k2`) -- 排序键必须一致 DISTRIBUTED BY HASH(`k2`) BUCKETS 8 -- 分桶键类型和分桶数必须一致 PROPERTIES ( "colocate_with" = "group1" -- 指定为同一组 ); CREATE TABLE `tbl2` ( `k1` date NOT NULL COMMENT "", `k2` int(11) NOT NULL COMMENT "", `v1` int(11) SUM NOT NULL COMMENT "" ) ENGINE=OLAP AGGREGATE KEY(`k1`, `k2`) -- 排序键必须一致 DISTRIBUTED BY HASH(`k2`) BUCKETS 8 -- 分桶键类型和分桶数必须一致 PROPERTIES ( "colocate_with" = "group1" -- 指定为同一组 );
要想达到优化查询的目的,必须满足下面这些条件:
- 同一 CG 内的表的分桶键的类型、数量和顺序完全一致,并且桶数一致,从而保证多张表的数据分片能够一一对应地进行分布控制。
- 同 CG 的表的分桶键的名字可以不相同,分桶列的定义在建表语句中的出现次序可以不一致,但是在 DISTRIBUTED BY HASH(col1, col2, ...) 的对应数据类型的顺序要完全一致。
- 同一个 CG 内所有表的所有分区的副本数必须一致(默认都是 3)。
- 同一个 CG 内所有表的分区键,分区数量可以不同。
查询是否得到优化:
explain SELECT * FROM tbl1 INNER JOIN tbl2 ON (tbl1.k2 = tbl2.k2);
4.2、外部表
StarRocks 不支持修改(update)功能的,所以如果 StarRocks 要修改数据的话,要么把数据模型设置为主键模型或者更新模型,同时 StarRocks 也提供了一种方案——外部表,也就是可以让 StarRocks 对接外部表,当外部表发生变化的时候,StarRocks 自己也会发生变化。当前 StarRocks 已支持的第三方数据源包括 MySQL、Elasticsearch、Apache Hive™、StarRocks、Apache Iceberg 和 Apache Hudi。对于 StarRocks 数据源(StarRocks类型的外部表),现阶段只支持 Insert 写入,不支持读取;对于其他数据源(其它类型外部表),现阶段只支持读取,还不支持写入。
4.2.1、MySQL 外部表
首先在 MySQL 创建一张测试表:
插入测试数据:
在 StarRocks 中创建外部表:
CREATE EXTERNAL TABLE mysql_external_table ( id int, name varchar(20), age int ) ENGINE=mysql PROPERTIES ( "host" = "hadoop102", "port" = "3306", "user" = "root", "password" = "123456", "database" = "starrocks", "table" = "test_t1" );
查询外部表:
需要注意的是,StarRocks 是不支持修改数据的(不管是外部表还是内部表):
但是可以通过修改外部数据源来更新 StarRocks 的外部表:
4.2.2、Hive 外部表
启动 Hadoop、Hive(这里很可能遇到 Yarn 启动失败,因为 StarRocks 会占用 Yarn 的 8030、8040 端口)
通过 tail -500 xxx-resourcemanager.log 查看日志
查看端口是否被占用:
netstat -tnlp | grep :8040
监听日志文件:
tail -f 日志文件.log
修改被占用的端口:
创建 Hive 表:
use test; create table test_t1( id int , name string, age int);
向 Hive 表中插入数据(这里用的是 Spark 引擎):
在 StarRocks 中创建 Hive 数据源:
CREATE EXTERNAL RESOURCE "hive0" PROPERTIES ( "type" = "hive", "hive.metastore.uris" = "thrift://hadoop102:9083");
创建 Hive 外部表:
create external table hive_t1( id int, name varchar(20), age int) ENGINE=HIVE PROPERTIES ( "resource" = "hive0", "database" = "test", "table" = "test_t1" );
去 hadoop102:8030 的 WebUI 去查看日志:
去官网查询解决方案:
还是查询失败,尝试换 csv 数据源的 Hive 表作为外部表还是不行(可能是版本的问题?之后解决再来更新)。
4.3、数组
StarRocks 是支持数组类型字段的,建表的时候使用。
CREATE TABLE student( id INT, hobbies ARRAY<INT> ) DUPLICATE KEY(id) DISTRIBUTED BY HASH(id) BUCKETS 3;
查询数组字段指定索引的值:
同时 StarRocks 也支持嵌套数组
create table t1( c0 INT, c1 ARRAY<ARRAY<VARCHAR(10)>> ) duplicate key(c0) distributed by hash(c0) buckets 3; INSERT INTO t1 VALUES(1, [[1,2,3],[1,2,3],[4,5,6]]);
数组的使用有以下限制
- 只能在duplicate table(明细模型)中定义数组列
- 数组列不能作为key列(以后可能支持)
- 数组列不能作为distribution列
- 数组列不能作为partition列