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);2、外部表
StarRocks支持以外部表的形式,接入其他数据源。外部表指的是保存在其他数据源中的数据表,而StartRocks只保存表对应的元数据,并直接向外部表所在数据源发起查询。目前StarRocks已支持的第三方数据源包括MySQL、ElasticSearch、Hive以及StarRocks。对于StarRocks数据源,现阶段只支持Insert写入,不支持读取,对于其他数据源,现阶段只支持读取,还不支持写入。
2.1、MySql外部表星型模型中,数据一般划分为维度表和事实表。维度表数据量少,但会涉及 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也会实时同步。如下所示:
2.2、Hive外部表 3、数组字段类型,数组。在建表时指定字段类型。
使用一维数组:
-- 使用一维数组 create table t0( c0 INT, c1 ARRAY) 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> ) 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;
使用限制:
- 只能在duplicate table中定义数组列
- 数组列不能作为key列(以后可能支持)
- 数组列不能作为distribution列
- 数组列不能作为partition列
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)