数据访问

本文介绍了通过ETL资源组访问Lindorm宽表引擎和列存数据的方法,包括环境配置、数据源切换、数据操作等步骤。

前提条件

注意事项

如果应用部署在ECS实例,通过专有网络访问Lindorm实例前,需要确保Lindorm实例和ECS实例满足以下条件,以保证网络的连通性。

  • 所在地域相同,并建议所在可用区相同(以减少网络延时)。

  • ECS实例与Lindorm实例属于同一专有网络。

步骤一:连接ETL资源组

  1. 下载Spark发布包

  2. 解压Spark发布包。

  3. 使用解压后的路径设置SPARK_HOME环境变量。

    export SPARK_HOME=/path/to/spark/;
  4. 填写配置文件:$SPARK_HOME/conf/beeline.conf

    • endpoint:Lindorm计算引擎的JDBC地址。如何获取,请参见查看连接地址

    • user:宽表引擎的用户名。

    • password:宽表用户名对应的密码。

    • shareResource:相同用户的多个会话之间是否共享计算资源,默认值为true

    • compute-group:设置要使用的计算引擎ETL资源组的名字,不设置则默认为default

      说明

      您可以在beeline.conf中添加更多作业参数,格式为:key=value,详细参数介绍请参考作业配置说明

  5. 进入$SPARK_HOME/bin目录并运行./beeline命令进入交互会话。在交互会话中输入SQL语句,执行写入或查询操作。

步骤二:访问数据

ETL资源组支持访问两种Catalog(用于标识不同的数据源):lindorm_columnar(列存数据源)和lindorm_table(宽表数据源),默认连接的Catalog为 lindorm_columnar,其决定了直接执行的SQL操作所作用的数据源。

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

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

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

访问列存数据

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

  1. 创建并使用数据库。

    -- 创建数据库
    CREATE DATABASE etldemo;
    
    -- 使用该数据库
    USE etldemo;
  2. 创建数据表并写入数据。

    -- 创建表
    CREATE TABLE test (id INT, name STRING)
    
    -- 插入数据
    INSERT INTO test VALUES (0, 'Jay'), (1, 'Edison');
  3. 查询数据。

    • 示例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 |
      +------+--------+------+--------+
  4. 将查询结果写入表中。

    INSERT INTO test SELECT * FROM test;
  5. 删除表。

    DROP TABLE test PURGE;
  6. 删除数据库。

    DROP DATABASE etldemo;

访问宽表数据

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

宽表引擎数据存储在名为lindorm_tableCatalog中。访问宽表引擎中的数据,需显式执行USE lindorm_table;切换至该Catalog中。

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

-- 创建数据库
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'); 

lindorm-beeline交互会话中,执行以下查询语句访问宽表数据。

  1. 显式切换数据源并使用数据库。

    -- 显式切换数据源
    USE lindorm_table;
    
    -- 使用test数据库
    USE test;
  2. 查询宽表数据。

    示例1:

    SELECT * FROM tb LIMIT 5;

    返回结果:

    +------+--------+---------+
    | id   | name   | address |
    +------+--------+---------+
    | 001  | Jack   | hz      |
    | 002  | Edison | bj      |
    +------+--------+---------+

    示例2:

    SELECT count(*) FROM tb;

    返回结果:

    +-----------+
    | count(1)  |
    +-----------+
    | 2         |
    +-----------+

相关文档

您也可以在JAR作业和Python作业中通过Spark SQLJDBC的方式访问Lindorm列存和宽表数据进行数据分析,详细介绍请参考参见以下文档: