更新时间:2026-08-07 GMT+08:00
分享

基于DataArts Studio实现拉链表

拉链表是数据仓库设计中用来处理数据变化的一种技术,它允许保存历史数据,记录一个事物从开始到当前状态的所有变化信息,可以反映任意时间点数据的状态。

在华为云DataArts Studio中实现拉链表(也称为慢变化维度表)可以通过以下详细步骤进行操作。拉链表通常用于记录维度表中的历史变化,每个记录包含开始和结束时间,以表示该记录的有效时间段。

前提条件

  • 已经在管理中心创建MRS Hive数据连接。详细操作请参见MRS Hive数据连接参数说明
  • DataArts Studio云服务包含数据架构组件。该能力与数据架构维度表相关。

适用场景

在设计数据仓库的数据模型时,拉链存储技术可作为一种解决方案,满足以下需求:

  • 数据量较大。
  • 表中的部分字段被更新。

    例如,用户的地址、产品的描述信息、订单的状态、交付日期和手机号码等。

  • 需要查看某一个时间点或时间段的历史信息。

    例如,学生信息(如成绩、课程选择等)可能会发生变化,需要记录这些变化的历史数据。

  • 变化的比例不大或频率不高。

    假设某平台总共有100万个会员,且每天新增和发生变化的会员只有1万左右,如果每天都在表中保留一份全量,那么每次全量中会保存很多不变的信息,极大地浪费了存储资源。

开发作业

  1. 登录DataArts Studio管理控制台

    详情请参考访问DataArts Studio实例控制台

  2. DataArts Studio控制台首页,选择对应工作空间的“数据开发”模块,进入数据开发页面。
  3. 在左侧菜单栏选择“数据开发 > 脚本开发”,创建一个Hive SQL脚本。

    编写Hive SQL脚本创建初始拉链表。假设原始维度表为dim_table,拉链表为dim_table_history,可以使用以下SQL脚本:

    CREATE TABLE dim_table_history (
        id INT,
        name STRING,
        description STRING,
        start_date TIMESTAMP,
        end_date TIMESTAMP,
        current_flag BOOLEAN);
    );

  4. 在左侧菜单栏选择“数据开发 > 作业开发”,创建一个新的数据开发批处理的Pipeline主作业。
  5. 配置MRS Hive SQL节点。

    1. 在作业画布中,从左侧节点列表中拖动“MRS Hive SQL”节点到画布上。单击MRS Hive SQL节点,进入节点配置页面。
    2. 创建初始拉链表

      配置“SQL脚本”参数,需要新建Hive SQL脚本或者引用已创建的Hive SQL脚本。新建时,单击编写Hive SQL脚本创建初始拉链表。假设原始维度表为dim_table,拉链表为dim_table_history,可以使用以下SQL脚本:

      CREATE TABLE dim_table_history (
          id INT,
          name STRING,
          description STRING,
          start_date TIMESTAMP,
          end_date TIMESTAMP,
          current_flag BOOLEAN);
      );
      • 如果没有已创建好的脚本,单击“新建”按钮(),创建Hive SQL脚本,并引用该脚本。
      • 如果已创建好的脚本,直接引用已创建Hive SQL脚本。(3已创建)
      • 引用已创建的Hive SQL脚本时,数据连接、数据库等参数信息会自动同步已关联的脚本配置信息。
    3. 初始化拉链表

      将原始维度表中的数据初始化到拉链表中。假设原始维度表dim_table的结构为id、name、description,可以使用以下SQL脚本:

      INSERT INTO dim_table_history (id, name, description, start_date, end_date, current_flag)
      SELECT id, name, description, CURRENT_TIMESTAMP, '9999-12-31 23:59:59', TRUE
      FROM dim_table;

  6. 配置拉链表更新逻辑

    1. 配置另一个MRS Hive SQL节点。

      在作业画布中,从左侧节点列表中拖动另一个“MRS Hive SQL”节点到画布上。将前一个MRS Hive SQL节点连接到另一个MRS Hive SQL节点,单击另一个MRS Hive SQL节点,进入节点配置页面。

    2. 编写拉链表更新脚本。

      配置“SQL脚本”参数,需要新建Hive SQL脚本或者引用已创建的Hive SQL脚本。新建时,单击编写Hive SQL脚本更新拉链表。假设新的增量数据表为dim_table_new,可以使用以下SQL脚本:

      -- 更新现有记录的结束时间和当前标志
      UPDATE dim_table_history
      SET end_date = CURRENT_TIMESTAMP, current_flag = FALSE
      WHERE id IN (SELECT id FROM dim_table_new)
        AND current_flag = TRUE;
      
      -- 插入新的记录
      INSERT INTO dim_table_history (id, name, description, start_date, end_date, current_flag)
      SELECT id, name, description, CURRENT_TIMESTAMP, '9999-12-31 23:59:59', TRUE
      FROM dim_table_new;
      • 如果没有已创建好的脚本,单击“新建”按钮(),创建Hive SQL脚本,并引用该脚本。
      • 如果已创建好的脚本,直接引用已创建Hive SQL脚本。(上面6.b已创建)
      • 引用已创建的Hive SQL脚本时,数据连接、数据库等参数信息会自动同步已关联的脚本配置信息。

  7. (可选)配置Shell节点。

    1. 在作业画布中,从左侧节点列表中拖动“Shell”节点到画布上。
    2. 将Shell节点连接到另一个MRS Hive SQL节点,将MRS Hive SQL节点的输出端口连接到Shell节点的输入端口,确保Shell节点在MRS Hive SQL节点执行成功后开始执行。
    3. 编写Shell脚本
      1. 单击Shell节点,进入节点配置页面。
      2. 在“Shell语句”中编写Shell脚本,例如用于日志记录或数据验证的脚本:
        #!/bin/bash
        
        # 记录日志
        echo "拉链表更新完成,时间: ${date}"
        
        # 验证数据
        hadoop fs -cat /path/to/dim_table_history/* > /path/to/local/output/file
        
        if [ $? -eq 0 ]; then
            echo "数据验证成功"
        else
            echo "数据验证失败"
        fi

        在Shell脚本中,${date}是一个命令替换(Command Substitution)的语法,用于执行date命令并将其输出插入到脚本中。date命令用于显示或设置系统日期和时间。以下是对$(date) 的详细解释和如何获取及配置时间的步骤:

        1. ${date}的解释

        • 命令替换:${...} 是Shell中的命令替换语法,它会执行括号内的命令,并将命令的输出替换到当前位置。
        • date 命令:date命令用于显示当前的日期和时间。默认情况下,date命令会输出当前的日期和时间,格式为 YYYY-MM-DD HH:MM:SS。

        2. 示例

        在Shell脚本中,${date}会被替换为当前的日期和时间。例如:

        echo "当前时间: ${date}"

        执行上述脚本时,输出可能类似于:

        当前时间: 2023-10-05 14:45:32 
        3. 获取和配置时间
        • 默认格式:date命令默认输出当前的日期和时间,格式为 YYYY-MM-DD HH:MM:SS。
        • 自定义格式:你可以使用date命令的-d选项和格式化选项来获取特定格式的日期和时间。例如:
          • date "+%Y-%m-%d %H:%M:%S":输出格式为 YYYY-MM-DD HH:MM:SS。
          • date "+%Y-%m-%d":输出格式为 YYYY-MM-DD。
          • date "+%H:%M:%S":输出格式为 HH:MM:SS。

        4. 示例脚本

        以下是一个示例Shell脚本,列举了时间格式的输入语法,获取当前时间并记录日志:

        echo "拉链表更新完成,时间: ${date '+%Y-%m-%d %H:%M:%S'}"

  8. 作业配置完成后,保存并提交作业版本。运行作业以验证Hive SQL节点和Shell节点的执行结果。
  9. 对作业进行执行调度,在“批作业监控”查看作业运行结果。

    • 监控作业的执行状态,确保Hive SQL节点和Shell节点都成功执行。
    • 检查拉链表dim_table_history中的数据,确保数据更新正确。
    • 如果有错误,根据日志信息进行调试和修正。

      上面实现拉链表的操作中,两个MRS Hive SQL节点与Shell节点的关系说明如下:

      1. 两个MRS Hive SQL节点的关系:
        • 第一个MRS Hive SQL节点:负责创建初始拉链表并初始化数据。
        • 第二个MRS Hive SQL节点:负责更新拉链表,处理新的增量数据。

      2. 两个MRS Hive SQL节点与Shell节点的关系:

      • 第一个Hive SQL节点:在作业开始时执行,创建并初始化拉链表。
      • 第二个Hive SQL节点:在第一个Hive SQL节点执行成功后执行,更新拉链表。
      • Shell节点:在第二个MRS Hive SQL节点执行成功后执行,进行日志记录或数据验证。

      详细关系图如下:

      作业开始 > 第一个Hive SQL节点 (创建并初始化拉链表) > 第二个Hive SQL节点 (更新拉链表) > Shell节点 (日志记录或数据验证) > 作业结束

相关文档