摘要当需要盘点环境内“每个轻应用/桌面应用分别包含哪些页面”时,可以从元数据库抽取应用、页面相关源表,在 ETL 中加工成应用页面关系宽表,再制作一个带筛选器的查询看板。 一、适用场景该方法适用于以下场景: - 需要查询某个轻应用包含哪些页面。
- 需要查询某个桌面应用包含哪些页面。
- 需要按应用名称、应用类型快速筛选页面明细。
- 需要排查页面是否被多个应用引用。
- 需要在迁移、治理、权限梳理前导出应用与页面关系。
最终看板建议包含两个筛选器和一张明细表: | 卡片 | 类型 | 作用 |
|---|
| 应用类型筛选 | 筛选器 | 在“轻应用”和“桌面应用”之间切换 | | 应用名称筛选 | 筛选器 | 按应用名称定位目标应用 | | 应用页面明细表 | 明细表 | 展示应用与页面关系明细 |
二、整体思路整体流程如下: - 连接环境元数据库。
- 分别抽取应用、页面、页面路径相关原表。
- 在 ETL 中过滤有效记录。
- 在 ETL 中拆分轻应用页面列表、解析桌面应用页面结构。
- 合并轻应用和桌面应用的页面关系。
- 关联页面基础信息和页面路径信息。
- 去重并整理输出字段。
- 使用输出宽表制作看板筛选器和明细表。
本方案使用的元数据表如下: | 表名 | 用途 |
|---|
custom_app | 轻应用配置表,通过 page_list 获取轻应用包含的页面 ID | web_portal | 桌面应用配置表,通过 structure 获取桌面应用包含的页面 ID 和应用内页面名称 | page | 页面基础信息表,用于补齐页面名称 | page_path | 页面目录路径表,用于补充页面路径信息 |
三、准备元数据库数据集在数据集中选择可访问元数据库的数据账户,新建 4 个原始数据集。注意:这一层只抽源表,不在 SQL 中写业务逻辑。 | 数据集名称示例 | 源表 SQL |
|---|
元数据_custom_app_帮助中心demo | select * from custom_app | 元数据_web_portal_帮助中心demo | select * from web_portal | 元数据_page_帮助中心demo | select * from page | 元数据_page_path_帮助中心demo | select * from page_path |
这样处理有两个好处: - 源表数据集可被其他元数据分析场景复用。
- 后续字段清洗、过滤、关联规则集中在 ETL 中,逻辑更清晰。
四、通过 ETL 加工应用页面关系宽表新建 ETL,并将 ETL 放入指定目录。示例中使用的 ETL 为: 查询轻应用和桌面应用页面_ETL_多源算子版_帮助中心demo
输出数据集为: 应用页面关系宽表_多源ETL版_帮助中心demo
1. 输入节点在 ETL 中添加 4 个输入数据集节点,分别选择上一步创建的原始数据集: | 输入节点 | 数据来源 |
|---|
元数据_custom_app_帮助中心demo | 轻应用源表 | 元数据_web_portal_帮助中心demo | 桌面应用源表 | 元数据_page_帮助中心demo | 页面基础信息源表 | 元数据_page_path_帮助中心demo | 页面路径源表 |
2. 过滤有效数据对 4 个输入节点分别增加过滤行节点: | 过滤节点 | 处理逻辑 |
|---|
过滤有效轻应用 | 保留 is_del = 0 且 page_list 非空的轻应用记录 | 过滤有效桌面应用 | 保留 is_del = 0 且 structure 非空的桌面应用记录 | 过滤有效页面 | 保留 is_del = 0 的页面记录 | 过滤有效页面路径 | 保留 is_del = 0 的页面路径记录 |
这一步建议使用 ETL 的“过滤行”算子完成,不要把过滤条件写在源数据集 SQL 中。 3. 拆分轻应用页面列表轻应用的页面关系存放在 custom_app.page_list 中,字段内容是逗号分隔的页面 ID 列表。普通筛选、关联算子无法直接把逗号分隔内容展开成多行,因此这里使用 SQL 脚本节点做拆分。 节点名称: 拆分轻应用页面列表
SQL 示例: select
'轻应用' as app_type,
app_id,
coalesce(nullif(name, ''), app_id) as app_name,
dom_id,
trim(page_id_raw) as page_id,
cast(null as string) as app_page_name,
cast(1 as bigint) as page_level,
utime as app_utime
from input1
lateral view explode(split(page_list, ',')) ex as page_id_raw
where trim(page_id_raw) <> ''
该节点输出一行一条“轻应用 - 页面”关系。 4. 解析桌面应用页面结构桌面应用的页面关系存放在 web_portal.structure 中,字段内容是 JSON 数组。每个数组元素中包含页面 ID 和应用内页面名称。普通 ETL 算子无法直接展开 JSON 数组,因此这里也使用 SQL 脚本节点。 节点名称: 解析桌面应用页面结构
SQL 示例: select
'桌面应用' as app_type,
app_id,
coalesce(nullif(name, ''), app_id) as app_name,
dom_id,
item.pgId as page_id,
item.name as app_page_name,
cast(1 as bigint) as page_level,
utime as app_utime
from input1
lateral view explode(from_json(structure, 'array<struct<pgId:string,name:string>>')) ex as item
where item.pgId is not null
and trim(item.pgId) <> ''
该节点输出一行一条“桌面应用 - 页面”关系。 5. 合并两类应用关系使用“追加行”算子,将轻应用关系和桌面应用关系合并为统一结构。 节点名称: 合并轻应用和桌面应用页面关系
处理效果: | 来源 | 输出字段 |
|---|
| 轻应用拆分结果 | app_type、app_id、app_name、page_id 等 | | 桌面应用解析结果 | app_type、app_id、app_name、page_id、app_page_name 等 |
合并后,后续节点可以统一处理两类应用。 6. 关联页面名称使用“关联数据”算子,将合并后的应用页面关系左关联到页面基础表。 节点名称: 关联页面名称
关联方式: | 左表字段 | 右表字段 | 关联类型 |
|---|
page_id | pg_id | 左关联 |
关联后可获得页面基础表中的页面名称,用于兜底或替代应用配置里的页面名称。 7. 关联页面路径继续使用“关联数据”算子,将上一步结果左关联到页面路径表。 节点名称: 关联页面路径
关联方式: | 左表字段 | 右表字段 | 关联类型 |
|---|
page_id | pg_id | 左关联 |
如果环境中页面路径表记录不完整,路径字段可能为空,这不影响应用与页面关系查询。 8. 应用页面关系去重使用“删除重复行”算子,按以下字段去重: | 去重字段 |
|---|
app_type | app_id | page_id |
去重应放在计算“应用内页面数”之前,确保页面数统计基于唯一的应用页面关系。 9. 整理输出字段并计算页面数最后使用 SQL 脚本节点做字段命名、字段兜底和窗口统计。 节点名称: 整理输出字段并计算应用内页面数
SQL 示例: select
app_type as `应用类型`,
app_name as `应用名称`,
app_id as `应用ID`,
coalesce(page_name, app_page_name, page_id) as `页面名称`,
page_id as `页面ID`,
concat(app_name, ' > ', coalesce(page_name, app_page_name, page_id)) as `应用内页面路径`,
page_path_id_chain as `页面路径ID链路`,
concat('/page/', page_id) as `页面访问路径`,
dom_id as `域名`,
cast(page_level as bigint) as `页面层级`,
app_utime as `应用更新时间`,
count(1) over (partition by app_type, app_id) as `应用内页面数`
from input1
where page_id is not null
and trim(page_id) <> ''
该节点的主要作用如下: | 处理 | 说明 |
|---|
| 字段中文化 | 将 ETL 中的英文中间字段整理成看板可读字段 | | 页面名称兜底 | 优先使用页面基础表名称,其次使用应用内页面名称,最后使用页面 ID | | 页面访问路径拼接 | 按 /page/页面ID 输出页面访问路径 | | 应用内页面数统计 | 按应用类型和应用 ID 统计当前应用包含的页面数量 |
10. 输出数据集添加输出数据集节点,输出为应用页面关系宽表。 建议输出字段如下: | 字段 | 说明 |
|---|
| 应用类型 | 轻应用或桌面应用 | | 应用名称 | 应用显示名称,名称为空时使用应用 ID 兜底 | | 应用ID | 应用唯一标识 | | 页面名称 | 页面显示名称 | | 页面ID | 页面唯一标识 | | 应用内页面路径 | 拼接后的“应用 > 页面”展示字段 | | 页面路径ID链路 | 页面路径表中的路径链路 | | 页面访问路径 | 按 /page/页面ID 拼接 | | 域名 | 应用所属域名 | | 页面层级 | 示例按一级页面输出 | | 应用更新时间 | 应用配置更新时间 | | 应用内页面数 | 当前应用包含的页面数量 |
五、制作查询看板使用 ETL 输出的宽表制作看板。 1. 应用类型筛选器新建筛选器卡片,数据集选择“应用页面关系宽表”,字段选择: 应用类型
筛选器可设置为搜索列表,并联动到明细表: 应用类型 -> 应用类型
2. 应用名称筛选器新建筛选器卡片,数据集选择“应用页面关系宽表”,字段选择: 应用名称
筛选器可设置为搜索列表,并联动到明细表: 应用名称 -> 应用名称
3. 应用页面明细表新建明细表卡片,数据集选择“应用页面关系宽表”。建议放入以下字段: - 应用类型
- 应用名称
- 应用ID
- 页面名称
- 页面ID
- 应用内页面路径
- 页面路径ID链路
- 页面访问路径
- 域名
- 应用更新时间
- 应用内页面数
保存并发布看板后,用户即可按应用类型和应用名称查询每个应用中包含的页面。 六、示例验证结果

七、注意事项- 元数据库源表只建议做原样抽取,业务逻辑集中放在 ETL 中处理。
custom_app.page_list 是逗号分隔字段,需要在 ETL 中拆分成多行。web_portal.structure 是 JSON 数组,需要在 ETL 中解析并展开。- 建议过滤
is_del = 0,避免统计已删除应用或页面。 - 页面名称建议做兜底处理,优先使用页面基础表名称,再使用应用内页面名称,最后使用页面 ID。
- 页面路径表在部分环境中可能不完整,路径为空不代表应用页面关系无效。
- 如果需要进一步分析“一个页面被哪些应用引用”,可以在明细表中按页面 ID 搜索,也可以新增以页面 ID 为维度的统计卡片。
|