基于Druid的Superset无关联实现A-B-C请求链透视表的方法
解决方案:无JOIN实现A→B→C请求链透视表
问题根源
数据库中请求链拆分为两条独立记录(A→B、B→C),Superset透视表默认按单条记录的sender/recipient维度聚合,导致跨记录的关联信息断裂,出现空值列与筛选后上下游数据丢失的问题。
方案1:用窗口函数预处理完整链路信息
在Superset的SQL Lab中,通过窗口函数按requestId分组,给每条记录补全完整的A、B、C链路信息,无需关联操作:
WITH request_chain AS ( SELECT requestId, sender, recipient, status_code, -- 提取当前requestId对应的A节点 MAX(CASE WHEN sender LIKE 'A%' THEN sender END) OVER (PARTITION BY requestId) AS chain_A, -- 提取当前requestId对应的B节点(适配A→B和B→C两种记录) MAX(CASE WHEN sender LIKE 'B%' THEN sender WHEN recipient LIKE 'B%' THEN recipient END) OVER (PARTITION BY requestId) AS chain_B, -- 提取当前requestId对应的C节点 MAX(CASE WHEN recipient LIKE 'C%' THEN recipient END) OVER (PARTITION BY requestId) AS chain_C FROM ( -- 给每条记录标记发送方/接收方的实体类型 SELECT requestId, sender, recipient, status_code, CASE WHEN sender LIKE 'A%' THEN 'A' WHEN sender LIKE 'B%' THEN 'B' END AS sender_type, CASE WHEN recipient LIKE 'B%' THEN 'B' WHEN recipient LIKE 'C%' THEN 'C' END AS recipient_type FROM your_table_name ) t ) SELECT * FROM request_chain
注:
LIKE 'A%'这类判断逻辑需根据你的实体命名规则调整(比如固定前缀、特定标识等)。
预处理完成后,创建透视表的配置:
- 行维度:
requestId - 列维度:按层级选择
chain_A→chain_B→chain_C - 指标:分别统计
status_code = 's'的计数(成功)、status_code = 'f'的计数(失败)
方案2:通过自定义计算字段补全链路
若不想修改基础查询,可直接在数据集里添加自定义计算字段:
- 进入数据集编辑页面,新增以下3个计算字段:
chain_A:MAX(CASE WHEN sender LIKE 'A%' THEN sender END) OVER (PARTITION BY requestId)chain_B:MAX(CASE WHEN sender LIKE 'B%' THEN sender WHEN recipient LIKE 'B%' THEN recipient END) OVER (PARTITION BY requestId)chain_C:MAX(CASE WHEN recipient LIKE 'C%' THEN recipient END) OVER (PARTITION BY requestId)
- 保存数据集后,按方案1的透视表配置逻辑创建可视化即可。
效果验证
上述两种方案都能让每条记录携带完整的链路信息,最终生成的透视表不会出现多余的空值列,筛选任意链路节点时,上下游关联信息都会保留,完全匹配你给出的预期结果。
内容的提问来源于stack exchange,提问作者Devanjan Banerjee
相关产品推荐
相关产品推荐

