基于DataArts Studio实现拉链表
拉链表是数据仓库设计中用来处理数据变化的一种技术,它允许保存历史数据,记录一个事物从开始到当前状态的所有变化信息,可以反映任意时间点数据的状态。
在华为云DataArts Studio中实现拉链表(也称为慢变化维度表)可以通过以下详细步骤进行操作。拉链表通常用于记录维度表中的历史变化,每个记录包含开始和结束时间,以表示该记录的有效时间段。
前提条件
- 已经在管理中心创建MRS Hive数据连接。详细操作请参见MRS Hive数据连接参数说明。
- DataArts Studio云服务包含数据架构组件。该能力与数据架构维度表相关。
适用场景
在设计数据仓库的数据模型时,拉链存储技术可作为一种解决方案,满足以下需求:
开发作业
- 登录DataArts Studio管理控制台。
详情请参考访问DataArts Studio实例控制台。
- 在DataArts Studio控制台首页,选择对应工作空间的“数据开发”模块,进入数据开发页面。
- 在左侧菜单栏选择“数据开发 > 脚本开发”,创建一个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); ); - 在左侧菜单栏选择“数据开发 > 作业开发”,创建一个新的数据开发批处理的Pipeline主作业。
- 配置MRS Hive SQL节点。
- 在作业画布中,从左侧节点列表中拖动“MRS Hive SQL”节点到画布上。单击MRS Hive SQL节点,进入节点配置页面。
- 创建初始拉链表。
配置“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脚本时,数据连接、数据库等参数信息会自动同步已关联的脚本配置信息。
- 如果没有已创建好的脚本,单击“新建”按钮(
- 初始化拉链表。
将原始维度表中的数据初始化到拉链表中。假设原始维度表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;
- 配置拉链表更新逻辑。
- 配置另一个MRS Hive SQL节点。
在作业画布中,从左侧节点列表中拖动另一个“MRS Hive SQL”节点到画布上。将前一个MRS Hive SQL节点连接到另一个MRS Hive SQL节点,单击另一个MRS Hive SQL节点,进入节点配置页面。
- 编写拉链表更新脚本。
配置“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脚本时,数据连接、数据库等参数信息会自动同步已关联的脚本配置信息。
- 如果没有已创建好的脚本,单击“新建”按钮(
- 配置另一个MRS Hive SQL节点。
- (可选)配置Shell节点。
- 在作业画布中,从左侧节点列表中拖动“Shell”节点到画布上。
- 将Shell节点连接到另一个MRS Hive SQL节点,将MRS Hive SQL节点的输出端口连接到Shell节点的输入端口,确保Shell节点在MRS Hive SQL节点执行成功后开始执行。
- 编写Shell脚本。
- 单击Shell节点,进入节点配置页面。
- 在“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'}"
- 作业配置完成后,保存并提交作业版本。运行作业以验证Hive SQL节点和Shell节点的执行结果。
- 对作业进行执行调度,在“批作业监控”查看作业运行结果。
- 监控作业的执行状态,确保Hive SQL节点和Shell节点都成功执行。
- 检查拉链表dim_table_history中的数据,确保数据更新正确。
- 如果有错误,根据日志信息进行调试和修正。
上面实现拉链表的操作中,两个MRS Hive SQL节点与Shell节点的关系说明如下:
- 两个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节点 (日志记录或数据验证) > 作业结束
- 两个MRS Hive SQL节点的关系: