赞
踩
shuffle join 和 broadcast join 中,参与 join 的两张表的数据行,若满足 join 条件,则需要将它们汇合在一个节点上,完成 join。这两种 join 方式,都无法避免节点间数据网络传输带来额外的延迟和其他开销。 而 colocation join 则可避免数据网络传输开销,核心思想是将同一个 Colocation Group 中表,采用一致的分桶键、一致的副本数量和一致副本放置方式,因此如果 join 列为分桶键,则计算节点只需做本地 join 即可,无须从其他节点获取数据。
例如:创建两张测试表,并标记同一个group属性,让表与表join可以得到优化。并且两张表桶的个数保持一致。
- 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"
- );

创建表之后再进行两表join,并可以使用explain进行分析。如果优化生效执行计划里可看到colocate为true。
explain SELECT * FROM tbl1 INNER JOIN tbl2 ON (tbl1.k2 = tbl2.k2);
StarRocks支持以外部表的形式,接入其他数据源。外部表指的是保存在其他数据源中的数据表,而StartRocks只保存表对应的元数据,并直接向外部表所在数据源发起查询。目前StarRocks已支持的第三方数据源包括MySQL、ElasticSearch、Hive以及StarRocks。对于StarRocks数据源,现阶段只支持Insert写入,不支持读取,对于其他数据源,现阶段只支持读取,还不支持写入。
星型模型中,数据一般划分为维度表和事实表。维度表数据量少,但会涉及 UPDATE 操作。目前 StarRocks 中还不直接支持 UPDATE 操作(可以通过 Unique 数据模型实现),在一些场景下,可以把维度表存储在 MySQL 中,查询时直接读取维度表。
- -- 登录mysql,先创建测试表
-
- CREATE TABLE test_t1(
- id INT,
- `name` VARCHAR(20),
- age INT);
-
- -- 插入测试数据
- INSERT INTO test_t1 VALUES(1001,'张三',14),(1002,'李四',15),(1003,'王五',16);
-
- -- 登录starrocks,创建mysql外部表
- create external table mysql_t1(
- id int,
- name varchar(20),
- age int)
- ENGINE=mysql
- PROPERTIES
- (
- "host" = "hadoop2",
- "port" = "3306",
- "user" = "root",
- "password" = "123456",
- "database" = "mydb",
- "table" = "test_t1"
- );
-
- -- 查询mysql外部表,可以直接查询到数据
- select *from mysql_t1;

当mysql表中的数据有做修改,会实时同步,并且当mysql中的数据发生修改时,starrocks也会实时同步。如下所示:
字段类型,数组。在建表时指定字段类型。
使用一维数组:
- -- 使用一维数组
- create table t0(
- c0 INT,
- c1 ARRAY<INT>
- )
- duplicate key(c0)
- distributed by hash(c0) buckets 3;
-
- -- 插入数据
- INSERT INTO t0 VALUES(1, [1,2,3]);
-
- -- 如果要查询数组列的具体某个值,可用下标的方式取值,注意下标从1开始。比如我要查询[1,2,3]中的2,sql语句如下
- select c1[2] from t0;
使用嵌套数组:
- -- 创建测试表
- 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]]);
-
- -- 查询数据(3)查询数据,同样比如要查询[[1,2,3],[1,2,3],[4,5,6]]要查询其中的5,那就是下标为3中的数组下标为2的数值
- select c1[3][2] from t1;
使用限制:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。