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 方式)
-
克隆官方仓库:
bashgit clone https://github.com/apache/superset.git cd superset -
启动容器:
bashdocker-compose up -d -
创建管理员账户:
bashdocker-compose exec superset bash superset fab create-admin -
初始化数据库:
bashsuperset db upgrade superset init -
访问 UI:浏览器打开
http://localhost:8088,输入账户密码登录。
3. 连接数据源
Superset 支持主流数据库/数据仓库,核心步骤:
- 登录后,点击顶部 Data > Databases > + Database
- 选择数据源类型(如 MySQL、PostgreSQL、ClickHouse、Hive、BigQuery 等)
- 配置连接信息:
- SQLAlchemy URI :格式为
数据库类型://用户名:密码@主机:端口/数据库名
示例(MySQL):mysql+pymysql://root:123456@192.168.1.100:3306/sales_db - 测试连接,确认成功后保存。
- SQLAlchemy URI :格式为
二、 核心操作:从数据到可视化仪表盘
步骤1:创建数据集(Dataset)
数据集是可视化的基础,对应数据库中的表/视图/SQL查询结果。
- 点击 Data > Datasets > + Dataset
- 选择已连接的数据库,再选择目标表;或选择 Custom SQL 编写自定义查询(适合复杂数据加工)
- 配置字段类型:标记维度(Dimension,如时间、地区)和指标(Metric,如销售额、用户数)
- 保存数据集。
步骤2:制作可视化图表(Chart)
Superset 提供 50+ 图表类型(折线图、柱状图、饼图、热力图、地图等),操作流程统一:
- 点击 Charts > + Chart,选择数据集
- 选择图表类型(根据分析需求)
- 趋势分析:折线图/面积图
- 占比分析:饼图/环形图
- 对比分析:柱状图/条形图
- 地理分析:地图/气泡图
- 配置图表参数
- Data 标签:选择维度(X轴/分组)、指标(Y轴/计算方式,如 sum、avg、count)
- Customize 标签:设置标题、颜色、图例、坐标轴格式
- 点击 Run Query 预览效果,保存图表。
步骤3:搭建交互式仪表盘(Dashboard)
仪表盘用于整合多个图表,实现数据联动和一站式洞察。
- 点击 Dashboards > + Dashboard,输入名称并保存
- 进入仪表盘编辑模式,点击 + Add Chart,选择已创建的图表添加
- 布局调整:拖拽图表调整大小和位置
- 配置交互功能(核心亮点)
- 过滤器(Filter):添加时间、地区等过滤器,实现多图表联动筛选
- 图表联动:设置钻取功能(如点击"全国销售额"下钻到"省份销售额")
- 刷新策略:设置自动刷新时间(如5分钟/次)
- 保存仪表盘,分享给团队(支持权限控制)。
三、 进阶技巧:提升BI分析效率
1. 自定义指标与计算字段
-
在数据集编辑页,点击 + Add Metric 自定义指标,例如:
sqlSUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS 已支付销售额 -
支持窗口函数、聚合函数,满足复杂计算需求。
2. 权限管控(企业级必备)
- 基于 RBAC(角色权限控制):创建角色(如管理员、分析师、只读用户)
- 精细控制:限制用户对特定数据库、数据集、仪表盘的访问权限。
3. 性能优化
- 对大表创建物化视图,减少查询耗时
- 开启 缓存:在配置文件中设置 Redis 缓存,缓存查询结果
- 优化 SQL 查询:避免 select *,添加合理索引
4. 集成与扩展
- API 集成:通过 Superset REST API 实现自动化报表推送
- 自定义插件:开发自定义图表类型(基于 React)
- 告警功能:结合外部工具(如 AlertManager)实现指标异常告警
四、连接数据源准备工作
- 确保 Superset 服务正常运行(如 Docker 环境访问 http://localhost:8088),使用管理员账户登录。
- 提前准备目标数据库信息:地址、端口、用户名、密码、数据库名(Schema),并确保网络连通、账户有查询权限。
- 安装对应数据库驱动(Docker 部署通常已预装主流驱动,源码部署需手动安装,如
pip install mysqlclient)。
五、核心步骤:连接数据库(数据源)
- 进入数据库配置页:点击顶部 Data > Databases > + Database(或右上角"+"→Data→Connect Database)。
- 选择数据库类型:在"Supported Databases"中选择目标类型(如 MySQL、PostgreSQL、ClickHouse 等)。
- 配置连接信息(关键)
-
Display Name:自定义数据源名称(如"MySQL-销售库")。
-
SQLAlchemy URI :核心连接串,格式为
数据库类型://用户名:密码@主机:端口/数据库名,示例如下:数据库 连接串示例 MySQL mysql+pymysql://root:123456@192.168.1.100:3306/sales_dbPostgreSQL postgresql://user:pass@localhost:5432/analyticsClickHouse clickhouse+connect://user:pass@host:8123/defaultDoris doris://user:pass@host:9030/catalog.db -
高级配置(可选):开启 SSL 加密、设置连接超时、添加额外参数(如
?charset=utf8mb4)。
-
- 测试并保存:点击 Test Connection ,提示"Connection successful"后,点击 Save 完成数据库连接。
六、关键后续:注册数据集(Dataset)
数据库连接后,需将表/视图注册为数据集,才能用于图表制作:
- 进入数据集页:点击 Data > Datasets > + Dataset。
- 选择数据对象:依次选择已连接的数据库、Schema、目标表(或自定义 SQL 查询)。
- 配置字段属性:
- 标记维度(Dimension,如时间、地区)和指标(Metric,如销售额 sum(amount))。
- 设置时间列(用于时间筛选)、字段类型(字符串/数值/日期)。
- 保存数据集:点击 Add 完成注册,数据集将显示在列表中,可用于后续图表制作。
Superset 可视化图表集成到企业管理系统
核心是通过 嵌入(Embedding) 或 API 调用 实现,无需让用户单独登录 Superset。以下是 3种主流集成方案,按实现难度和灵活性排序,附详细操作步骤。
方案1:官方嵌入式集成(推荐,企业级首选)
Superset 支持 认证代理(Auth Proxy) 和 嵌入式令牌(Embed Token) 两种嵌入式方案,可直接将仪表盘/图表嵌入到企业系统页面中,保留交互功能(如筛选、下钻)。
核心前提
- Superset 需配置为 允许嵌入 (修改配置文件
superset_config.py)。 - 企业管理系统与 Superset 需在同一域名或配置 CORS 跨域。
步骤1:开启 Superset 嵌入功能
修改 superset_config.py,添加以下配置:
python
# 允许嵌入式访问
ENABLE_EMBEDDING = True
# 允许的嵌入来源(企业管理系统域名,* 为测试环境)
EMBEDDED_SUPERSET_DOMAINS = ["https://your-enterprise-system.com"]
# 使用令牌认证(推荐)
EMBEDDING_SECRET_KEY = "your-secret-key" # 自定义强密钥
重启 Superset 服务使配置生效。
步骤2:生成嵌入令牌(两种方式)
方式A:手动生成(测试用)
- 进入 Superset 仪表盘页面,点击右上角 ... > Embed Dashboard。
- 设置权限(如允许筛选、隐藏导航栏),生成 嵌入链接 或 嵌入代码 。
-
嵌入链接示例:
https://superset.your.com/embed/dashboard/abc123?token=xxx -
嵌入代码示例(iframe):
html<iframe src="https://superset.your.com/embed/dashboard/abc123?token=xxx" width="100%" height="800px" frameborder="0" ></iframe>
-
方式B:API 生成(生产用,动态授权)
通过 Superset REST API 生成令牌,适合根据企业系统用户权限动态返回图表。
-
获取 Superset 管理员 Token:
bashcurl -X POST "https://superset.your.com/api/v1/security/login" \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"your-pass","provider":"db"}' -
调用嵌入令牌生成接口:
bashcurl -X POST "https://superset.your.com/api/v1/security/guest_token/" \ -H "Authorization: Bearer {admin-token}" \ -H "Content-Type: application/json" \ -d '{ "user": {"username": "enterprise-user-01"}, "resources": [{"type": "dashboard", "id": 1}], # 仪表盘ID "rls": [] # 可选,行级权限过滤 }' -
接口返回
guest_token,拼接成 iframe 链接嵌入企业系统。
步骤3:在企业管理系统中嵌入
直接将 iframe 代码插入到企业系统的页面模板中,示例(Java 后端 Thymeleaf 模板):
html
<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
-
找到目标图表的 chart_id (Superset 图表页面 URL 中
chart/123的123即为 ID)。 -
调用数据查询接口:
bashcurl -X POST "https://superset.your.com/api/v1/chart/data" \ -H "Authorization: Bearer {admin-token}" \ -H "Content-Type: application/json" \ -d '{ "chart_id": 123, "form_data": { # 图表查询参数,可自定义筛选条件 "granularity": "month", "time_range": "Last 6 Months" } }' -
接口返回 JSON 格式数据,包含
columns(字段名)和data(数据行)。
步骤2:前端渲染数据
以 React + ECharts 为例,将 API 数据渲染为图表:
jsx
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 图表为图片
-
进入图表页面,点击右上角 ... > Export > Export as PNG,手动下载图片。
-
或通过 API 批量导出:
bashcurl -X GET "https://superset.your.com/api/v1/chart/123/export/png" \ -H "Authorization: Bearer {admin-token}" \ -o "sales-chart.png"
步骤2:集成到企业系统
将图片上传到企业系统的文件服务器,在页面中通过 <img> 标签引用:
html
<img src="/static/images/sales-chart.png" alt="销售趋势图" class="report-img">
方案优势与局限
| 优势 | 局限 |
|---|---|
| 实现最简单,无跨域/鉴权问题 | 无交互功能,数据需手动/定时更新 |
| 兼容性好,支持所有前端框架 | 不适合实时数据展示 |
关键注意事项(企业级部署)
-
权限管控
- 生产环境禁止使用
EMBEDDED_SUPERSET_DOMAINS = ["*"],需指定企业系统域名。 - 通过 行级安全(RLS) 控制用户只能查看权限内数据(如部门、区域数据)。
- 生产环境禁止使用
-
性能优化
- 开启 Superset 缓存,减少重复查询。
- 嵌入式方案建议使用 CDN 加速 Superset 静态资源。
-
安全防护
- 嵌入令牌需设置 过期时间,避免长期有效。
- 企业系统与 Superset 之间的通信建议使用 HTTPS 加密。