数据访问

本文介绍通过OLAP资源组访问列存和宽表数据的方法。相比宽表引擎自带的SQL功能,OLAP资源组提供更完整的SQL分析能力,适用于海量数据的高并发分析场景。

前提条件

获取OLAP资源组连接地址并连接

  1. 登录Lindorm管理控制台。在左上角选择实例所属的地域。在实例列表页,单击目标实例ID或者目标实例所在行操作列的管理

  2. 实例详情页的配置信息区域,单击计算引擎操作列的资源组管理

    image

  3. 资源组详情界面,选择已创建的状态&描述信息运行中OLAP资源组,将鼠标悬停在该OLAP资源组名称之上,获取OLAP资源组VPC内网连接地址,例如jdbc:mysql://ld-bp1dv48fk0yg0****-olap-proxy-ldps.lindorm.aliyuncs.com:9030

  4. 配置MySQL客户端后,通过JDBC连接OLAP资源组的VPC内网地址(需去掉末尾的冒号及端口号),并使用Lindorm宽表引擎的用户名和密码登录,即可通过MySQL协议连接到OLAP资源组。

    mysql -hld-bp1dv48fk0yg0****-olap-proxy-ldps.lindorm.aliyuncs.com -P9030 -uroot -p

    执行以上语句后,可以看到MySQL命令行提示符,即可输入需要执行的SQL语句。

访问数据

OLAP资源组支持访问两种Catalog(用来标识不同的数据源):lindorm_columnar(列存数据源)、lindorm_table(宽表数据源)。OLAP资源组默认连接的Cataloglindorm_columnar默认Catalog决定了直接执行的SQL操作对象

可通过以下SQL语句实现列存与宽表数据源的灵活切换:

  • 切换至宽表数据源:SET CATALOG lindorm_table;

  • 切换至列存数据源:SET CATALOG lindorm_columnar;

执行切换操作后,可通过 SELECT catalog(); 查询当前连接的Catalog。

重要

OLAP资源组不支持CREATE TABLE AS SELECTDELETE FROM语句。

访问列存数据

列存数据采用兼容Apache Iceberg规范的开放数据湖格式,物理存储于Lindorm实例底层分布式文件系统。该存储架构支持多类型资源组共享访问,同一Lindorm实例中的OLAP资源组与ETL资源组均可直接访问该列式存储数据。

  1. 创建数据库。

    CREATE DATABASE olapdemo;
  2. 使用数据库。

    USE olapdemo;
  3. 创建数据表。

    CREATE TABLE test (id INT, name STRING) ENGINE = iceberg;
  4. 写入数据。

    INSERT INTO test VALUES (0, 'Jay'), (1, 'Edison');
  5. 查询数据。

    • 示例1:

      SELECT id, name FROM test WHERE id != 0;

      返回结果:

      +------+--------+
      | id   | name   |
      +------+--------+
      |    1 | Edison |
      +------+--------+
    • 示例2:

      SELECT count(distinct name) FROM test;

      返回结果:

      +----------------------+
      | count(DISTINCT name) |
      +----------------------+
      |                    2 |
      +----------------------+
    • 示例3:

      SELECT * FROM
       (SELECT id, name FROM test WHERE id != 0) t0
       JOIN
       (SELECT id, name FROM test WHERE id != 2) t1
       ON t0.id=t1.id;
      +------+--------+------+--------+
      | id   | name   | id   | name   |
      +------+--------+------+--------+
      |    1 | Edison |    1 | Edison |
      +------+--------+------+--------+
  6. 将查询结果写入表中。

    INSERT INTO test SELECT * FROM test;
  7. 删除数据表。

    DROP TABLE test;
  8. 删除数据库。

    DROP DATABASE olapdemo;

访问宽表数据

Lindorm宽表引擎是面向海量结构化与半结构化数据设计的分布式存储系统,兼容HBase、Phoenix(SQL)、Cassandra等开源标准接口,支持单表百万亿级行数据存储、千万级并发访问、毫秒级响应,以及跨机房强一致容灾能力。其适用于元数据管理、订单账单、用户画像、社交图谱、日志分析等场景,可高效满足业务对大规模数据在线存储与实时查询的需求。

OLAP资源组支持连接至宽表引擎,通过独立计算资源和增强的查询能力,实现对宽表数据的实时分析。

若您已有可使用的宽表,请直接进入下一步。若您尚未创建,请连接宽表引擎,参考以下语句创建宽表tb

-- 创建数据库
CREATE DATABASE test; 

--使用该数据库
USE test; 

--创建数据表,并插入两条数据
CREATE TABLE tb (id varchar, name varchar, address varchar,  primary key(id, name)) ; 
UPSERT INTO tb (id, name, address) values ('001', 'Jack',  'hz'); 
UPSERT INTO tb (id, name, address) values ('002', 'Edison',  'bj'); 

在连接OLAP资源组的MySQL命令行工具中,执行以下查询语句访问宽表数据。

  1. 显式切换数据源到lindorm_table

    SET CATALOG lindorm_table;
  2. 查看当前Lindorm实例下所有数据库。

    SHOW DATABASES;
  3. 使用数据库test

    USE test;
  4. 查看当前数据库已存在的所有表。

    SHOW TABLES;
  5. 查询宽表数据。

    • 示例1:

      SELECT * FROM tb LIMIT 5;

      返回结果:

      +------+--------+---------+
      | id   | name   | address |
      +------+--------+---------+
      | 001  | Jack   | hz      |
      | 002  | Edison | bj      |
      +------+--------+---------+
    • 示例2:

      SELECT count(*) FROM tb;

      返回结果:

      +----------+
      | count(*) |
      +----------+
      |        2 |
      +----------+
重要

宽表引擎数据源仅支持查询已存在表的数据,不支持其他操作。

通过宽表引擎使用OLAP资源组

OLAP资源组可作为宽表引擎的扩展查询引擎。您只需连接宽表引擎地址,通过在SQL中指定Hint,即可将复杂查询定向转发至OLAP资源组执行,无需单独连接OLAP资源组。这样,您既能利用宽表引擎的高并发查询能力,又能调用OLAP资源组的复杂分析能力,实现SQL语句的智能分发。

当通过MySQLLindorm-cli连接到Lindorm宽表引擎后,可使用Hint: _use_ldps_ 将特定SQL转发至OLAP资源组执行,例如:

-- 使用数据库
USE db01;

-- 将查询转发到默认OLAP资源组
SELECT /*+ _use_ldps_ */ * FROM tb01 LIMIT 5;

-- 将查询转发到指定 OLAP 资源组
SELECT /*+ _use_ldps_(olap_cg_name) */ * FROM tb01 LIMIT 5;

Hint的格式是:/*+ _use_ldps_(olap_cg_name) */必须出现在最外层SELECT关键字的后面。其中(olap_cg_name)部分用来指定查询要转发到的OLAP资源组名称。如果未指定,则查询会被转发到默认资源组

进阶用法

在转发至OLAP资源组时,可以指定查询语句执行时的会话变量,以便能精细化控制查询时的具体行为。指定变量的示例如下:

-- 指定查询的会话变量
SELECT /*+ _use_ldps_ */ /*+ SET_VAR(enable_lindorm_table_concurrent_scan = false) */ * FROM tb01 LIMIT 5;

-- 指定多个查询的会话变量
SELECT /*+ _use_ldps_ */ /*+ SET_VAR(enable_lindorm_table_concurrent_scan = false, enable_build_join_filter_from_lindorm_table_in_opt = true) */ * FROM tb01 LIMIT 5;

指定会话变量的Hint格式为:/*+ SET_VAR(enable_lindorm_table_concurrent_scan = false) */,其中变量是以key = value方式指定,多个变量间可以用逗号分隔,具体支持的变量信息见下节。这个Hint的位置是接在上面转发OLAP资源组的Hint之后,不能与转发Hint共用一个注释块。

说明

指定会话Hint的位置是接在转发OLAP资源组的Hint之后,不能与转发Hint共用一个注释块。

参数说明

变量

类型

默认值

说明

enable_build_join_filter_from_lindorm_table_in_opt

BOOL

FALSE

在对宽表引擎中两表进行JOIN关联时,可以根据右表的查询结果,生成左表的过滤条件并下推,以加速左表数据扫描过程。

enable_lindorm_table_concurrent_scan

BOOL

TRUE

该参数控制读取Lindorm宽表的并发行为。配置为TRUE时,则以多并发方式扫描宽表;配置为FALSE时,则以单并发方式扫描宽表。