Apache Superset 是一款开源的现代化数据BI工具,由 Airbnb 开源的“现代化的企业级 BI(商业智能) Web 应用程序”,其通过创建和分享 dashboard,为数据分析提供了轻量级的数据查询和可视化方案,支持数据可视化探索、交互式仪表盘制作、SQL查询等功能,能帮助技术和非技术人员快速实现数据洞察,前端主要用到了 React 和 NVD3/D3,而后端则基于 Python 的 Flask 框架和 Pandas、SQLAlchemy 等依赖库。以下是基于 Superset 做数据BI的结构化流程与核心操作指南,兼顾部署、使用和优化。
一、 核心前提:部署与环境准备
1. 部署方式选择
| Docker Compose | 测试/个人使用/小型团队 | 低(一键部署) |
| Kubernetes | 企业级生产环境 | 中(需容器编排经验) |
| 源码部署 | 二次开发/定制化需求 | 高(需Python环境) |
2. 快速部署(Docker Compose 方式)
cd superset
superset fab create-admin
superset init
3. 连接数据源
Superset 支持主流数据库/数据仓库,核心步骤:
- SQLAlchemy URI:格式为 数据库类型://用户名:密码@主机:端口/数据库名
示例(MySQL):mysql+pymysql://root:123456@192.168.1.100:3306/sales_db - 测试连接,确认成功后保存。
二、 核心操作:从数据到可视化仪表盘
步骤1:创建数据集(Dataset)
数据集是可视化的基础,对应数据库中的表/视图/SQL查询结果。
步骤2:制作可视化图表(Chart)
Superset 提供 50+ 图表类型(折线图、柱状图、饼图、热力图、地图等),操作流程统一:
- 趋势分析:折线图/面积图
- 占比分析:饼图/环形图
- 对比分析:柱状图/条形图
- 地理分析:地图/气泡图
- Data 标签:选择维度(X轴/分组)、指标(Y轴/计算方式,如 sum、avg、count)
- Customize 标签:设置标题、颜色、图例、坐标轴格式
步骤3:搭建交互式仪表盘(Dashboard)
仪表盘用于整合多个图表,实现数据联动和一站式洞察。
- 过滤器(Filter):添加时间、地区等过滤器,实现多图表联动筛选
- 图表联动:设置钻取功能(如点击“全国销售额”下钻到“省份销售额”)
- 刷新策略:设置自动刷新时间(如5分钟/次)
三、 进阶技巧:提升BI分析效率
1. 自定义指标与计算字段
- 在数据集编辑页,点击 + Add Metric 自定义指标,例如:SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS 已支付销售额
- 支持窗口函数、聚合函数,满足复杂计算需求。
2. 权限管控(企业级必备)
- 基于 RBAC(角色权限控制):创建角色(如管理员、分析师、只读用户)
- 精细控制:限制用户对特定数据库、数据集、仪表盘的访问权限。
3. 性能优化
- 对大表创建物化视图,减少查询耗时
- 开启 缓存:在配置文件中设置 Redis 缓存,缓存查询结果
- 优化 SQL 查询:避免 select *,添加合理索引
4. 集成与扩展
- API 集成:通过 Superset REST API 实现自动化报表推送
- 自定义插件:开发自定义图表类型(基于 React)
- 告警功能:结合外部工具(如 AlertManager)实现指标异常告警
四、连接数据源准备工作
五、核心步骤:连接数据库(数据源)
- Display Name:自定义数据源名称(如“MySQL-销售库”)。
- SQLAlchemy URI:核心连接串,格式为 数据库类型://用户名:密码@主机:端口/数据库名,示例如下:
数据库连接串示例 MySQL mysql+pymysql://root:123456@192.168.1.100:3306/sales_db PostgreSQL postgresql://user:pass@localhost:5432/analytics ClickHouse clickhouse+connect://user:pass@host:8123/default Doris doris://user:pass@host:9030/catalog.db - 高级配置(可选):开启 SSL 加密、设置连接超时、添加额外参数(如 ?charset=utf8mb4)。
六、关键后续:注册数据集(Dataset)
数据库连接后,需将表/视图注册为数据集,才能用于图表制作:
- 标记维度(Dimension,如时间、地区)和指标(Metric,如销售额 sum(amount))。
- 设置时间列(用于时间筛选)、字段类型(字符串/数值/日期)。
Superset 可视化图表集成到企业管理系统
核心是通过 嵌入(Embedding) 或 API 调用 实现,无需让用户单独登录 Superset。以下是 3种主流集成方案,按实现难度和灵活性排序,附详细操作步骤。
方案1:官方嵌入式集成(推荐,企业级首选)
Superset 支持 认证代理(Auth Proxy) 和 嵌入式令牌(Embed Token) 两种嵌入式方案,可直接将仪表盘/图表嵌入到企业系统页面中,保留交互功能(如筛选、下钻)。
核心前提
步骤1:开启 Superset 嵌入功能
修改 superset_config.py,添加以下配置:
# 允许嵌入式访问
ENABLE_EMBEDDING = True
# 允许的嵌入来源(企业管理系统域名,* 为测试环境)
EMBEDDED_SUPERSET_DOMAINS = ["https://your-enterprise-system.com"]
# 使用令牌认证(推荐)
EMBEDDING_SECRET_KEY = "your-secret-key" # 自定义强密钥
重启 Superset 服务使配置生效。
步骤2:生成嵌入令牌(两种方式)
方式A:手动生成(测试用)
- 嵌入链接示例:https://superset.your.com/embed/dashboard/abc123?token=xxx
- 嵌入代码示例(iframe):<iframe
src="https://superset.your.com/embed/dashboard/abc123?token=xxx"
width="100%"
height="800px"
frameborder="0"
></iframe>
方式B:API 生成(生产用,动态授权)
通过 Superset REST API 生成令牌,适合根据企业系统用户权限动态返回图表。
-H "Content-Type: application/json" \\
-d '{"username":"admin","password":"your-pass","provider":"db"}'
-H "Authorization: Bearer {admin-token}" \\
-H "Content-Type: application/json" \\
-d '{
"user": {"username": "enterprise-user-01"},
"resources": [{"type": "dashboard", "id": 1}], # 仪表盘ID
"rls": [] # 可选,行级权限过滤
}'
步骤3:在企业管理系统中嵌入
直接将 iframe 代码插入到企业系统的页面模板中,示例(Java 后端 Thymeleaf 模板):
<div class="dashboard-container">
<h3>销售数据仪表盘</h3>
<iframe
th:src="@{https://superset.your.com/embed/dashboard/abc123?token=${guestToken}}"
width="100%"
height="900px"
style="border:none;"
></iframe>
</div>
方案优势与局限
| 保留 Superset 全部交互功能 | 需要配置跨域,部署复杂度中等 |
| 支持权限控制和行级过滤 | 嵌入页面样式需与企业系统适配 |
方案2:API 调用 + 前端渲染(高度自定义)
如果需要将 Superset 图表数据与企业系统前端组件深度融合(如自定义样式、联动业务数据),可通过 Superset API 获取图表数据,再用前端框架(Vue/React)渲染。
步骤1:获取图表数据 API
-H "Authorization: Bearer {admin-token}" \\
-H "Content-Type: application/json" \\
-d '{
"chart_id": 123,
"form_data": { # 图表查询参数,可自定义筛选条件
"granularity": "month",
"time_range": "Last 6 Months"
}
}'
步骤2:前端渲染数据
以 React + ECharts 为例,将 API 数据渲染为图表:
import React, { useEffect, useState } from 'react';
import * as echarts from 'echarts';
const SalesChart = () => {
const [chartData, setChartData] = useState(null);
useEffect(() => {
// 调用 Superset API 获取数据
fetch('https://superset.your.com/api/v1/chart/data', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('superset-token'),
'Content-Type': 'application/json'
},
body: JSON.stringify({ chart_id: 123, form_data: {…} })
})
.then(res => res.json())
.then(data => setChartData(data));
}, []);
useEffect(() => {
if (!chartData) return;
// 用 ECharts 渲染
const myChart = echarts.init(document.getElementById('sales-chart'));
myChart.setOption({
xAxis: { type: 'category', data: chartData.data.map(d => d.month) },
yAxis: { type: 'value' },
series: [{ data: chartData.data.map(d => d.sales), type: 'bar' }]
});
}, [chartData]);
return <div id="sales-chart" style={{ width: '100%', height: '400px' }}></div>;
};
export default SalesChart;
方案优势与局限
| 完全自定义样式,与企业系统无缝融合 | 失去 Superset 原生交互功能(需自行开发) |
| 支持与业务数据联动 | 需前端开发成本,API 调用需处理鉴权 |
方案3:静态图片导出(简单无交互)
适合只需要展示图表快照、无需交互的场景(如企业报表 PDF、邮件推送)。
步骤1:导出 Superset 图表为图片
-H "Authorization: Bearer {admin-token}" \\
-o "sales-chart.png"
步骤2:集成到企业系统
将图片上传到企业系统的文件服务器,在页面中通过 <img> 标签引用:
<img src="/static/images/sales-chart.png" alt="销售趋势图" class="report-img">
方案优势与局限
| 实现最简单,无跨域/鉴权问题 | 无交互功能,数据需手动/定时更新 |
| 兼容性好,支持所有前端框架 | 不适合实时数据展示 |
关键注意事项(企业级部署)
权限管控
- 生产环境禁止使用 EMBEDDED_SUPERSET_DOMAINS = ["*"],需指定企业系统域名。
- 通过 行级安全(RLS) 控制用户只能查看权限内数据(如部门、区域数据)。
性能优化
- 开启 Superset 缓存,减少重复查询。
- 嵌入式方案建议使用 CDN 加速 Superset 静态资源。
安全防护
- 嵌入令牌需设置 过期时间,避免长期有效。
- 企业系统与 Superset 之间的通信建议使用 HTTPS 加密。





