superset二次开发

背景

大数据时代商业智能(BI)和数据可视化诉求更为强烈,淘宝大屏更是风靡全球!数据可视化是大数据『最后一公里』。 数据可视化分析工具大致分为3类,开源、商业和传统bi工具。 业界目前比较流行的 开源BI工具:Superset、metabase、Redash、Cboard、d3js、Spagobi等, 商业BI工具:帆软、tableau、PowerBI、SmartBI、QlinkView、QuickBI、fineBI、阿里dataV等 传统BI工具:Congos、BIEE、BO、MicroStrategydeng等。

superset简介

Superset是一款轻量级的BI工具,由Airbnb的数据部门开源。截止目前,github累计31.3K个star。

开发部署

官方文档:http://superset.apache.org/arrow-up-right

环境

superset: 0.36.0

windows10

拉取镜像需配置代理:http://f1361db2.m.daocloud.ioarrow-up-right

docker部署安装步骤

docker search superset docker pull amancevice/superset docker run -d -p 8088:8088 --name superset amancevice/superset:latest --生成容器ID 60946ede506b docker exec -it -u root 60946ede506b fabmanager create-admin --app superset docker exec -it 60946ede506b superset db upgrade docker exec -it 60946ede506b superset load_examples docker exec -it 60946ede506b superset init docker exec -it 60946ede506b superset runserver

mac下部署步骤

  • 启动后端 superset

pip install -r requirements-dev.txt -i 国内源url

python -m flask run 默认端口起的是 5000

  • 启动前端 superset-frontend

npm install

npm run dev-server

默认端口是 9000

本地启动部署 (mac\win)

mac 启动无需修改,windows启动需要修改两处。

  1. 在webpack.config.js中新增代码

2. 在package.json中"dev-server"命令前加入 cross-env

通过该参数来设置环境

二次开发已实现的功能

v1.0

  • 增加和具体用户相关联的权限访问,不同用户看到的数据不同

  • 添加数值单位,在原有支持K的基础上增加中文 千,万,亿等

  • 新增两张自定义图表,top Bar (排行榜条形图)和 Mix line Bar (混合柱状条形图)

  • 汉化支持

v2.0

  • 可以自由配置上钻下卷的链条

  • 图表下钻,支持多级下钻

  • 图表上卷,支持多级上卷

  • 图表联动,在对一张图表配置了联动后,类似下钻的点击会影响到其他图表

v3.0

  • 给FilterBox新增级联属性,支持类似‘省份-区域-城市’这样的层级筛选

  • 添加统一登录,接入ldap账号体系内部实现无差别登陆,默认为普通用户权限

v4.0

  • 添加集成多个dashboard的门户层,根据层级菜单将多个dashboard加进来

  • 增加漏斗图(Funnel)

v5.0

  • 用antv改写了top bar,添加配色组件

  • 在top bar中支持指定分组值用某个具体颜色,例如支付方式‘支付宝’蓝色,'微信'绿色

  • 修复了top N在作用于多个分组的bug

  • pivot table合计有误 bugfix

  • 设置pivot table首行冻结

v6.0

v7.0

  • 增加bar chart,pie chart的antV图表

源码改动处

config.py

superset/views/core.py

新增自定义图表

新增数据接口(以TopBar为例)

TopBar图表组件

文件目录

依赖关系 TopBar -> ReactTopBar -> TopBarChartPlugin -> transformProps 以下依次为各个文件的源码

ReactTopBar.js

TopBar的演示图如下

中国地图

地图演示

类似地,添加Mix Line Bar、Funnel

Mix Line Bar演示

借助echarts已有的api,在control panel中新增了两个功能

  • 堆积图 (配置同一个stack值)

  • x轴缩放(解决分组过多时柱子细小看不清问题)

Funnel演示

## 图表的下钻、上卷 以下钻饼图为例,修改superset-ui 中的NVD3Vis.js 添加两个点击事件,

饼图演示

左下角显示已经下钻的层级,支持多层级下钻,点击左下角显示的层级为上卷到上一层。

图表使用实践

导入数据源、表

添加数据源,支持多数据源,导入数据源后从已有的表中添加一张,可以设置cache,支持SQL修改

创建charts

选择一个数据源,选择一个图表类型

SQL lab编写SQL

选择数据库、模式,直接写SQL模式发起查询

添加图表到dashboard

将制作好的图表添加到已有或新建的dashboard,完成看板制作

丰富dashboard

添加已有图表到dashboard中,自定义调整位置和大小; 支持图表联动配置; 支持过滤器指定图表变化; 支持markdown,可以添加视频; 支持修改css样式,夜间模式;

源码分析

这里以WordCloud为例。主要涉及到的js有如下 /src/explore/controlPanels/WordCloud 这是控制层 ,里面定义了charts左侧的组件。

superset已有的组件整理如下:

  • series

  • metric

  • ...

    太多了。。

组件的代码 罗列几个属性

  • requiresTime 是否需要时间

  • controlPanelSections 为左侧组件列表,label的值为组件名称,实现代码在 /src/explore/controls.jsx

    (在ui-plugin里,则是对应NVD3Controls.tsx 或其他图表包下的Controls)

  • controlOverrides 是你需要覆盖已有组件里的属性值

  • sectionOverrides 看Dual Line里的这块内容

当然,如果现有组件不能满足需求,可以自定义组件,自定义组件的代码放到和其他组件一样的位置 /src/explore/controls.jsx

注册左侧组件层 setupPlugins.ts registerValue('top_bar',TopBar) 注册图表type,有顺序 VizTypeControl.jsx DEFAULT_ORDER=[top_bar,....]

/visualizations 下新建一个文件夹取名自己的图表名称 TopBar

  • TopBar.jsx react组件,主要实现图表的样式,检测数据类型(prop-types)

  • TOpBar.less 类似CSS

  • ReactTopBar.js(或者是)

  • TopBarChartPlugin.js 继承图表插件父类ChartPlugin,构造方法里有 metaData(super-ui库的ChartMetaData对象【 界面上的图表名称显示为"Top Bar",描述等】),loadChart为加载React组件TopBar

    ps:如果是在ui-plugin里,则是对应TopBar/index.js

  • transformProps.js 这是转换类

加载顺序 : TopBarChartPlugin -> ReactTopBar -> transformProps -> TOpBar

技术栈学习了解

  • python flask框架

  • 熟悉Flask—login组件

  • react语言熟悉,了解React的html与js混用的写法,了解组件,了解react的生命周期 react入门arrow-up-right

  • 摘出几句敲黑板的话,加深一下理解: 1、HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写 2、React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。 3、组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)只有当它插入文档以后,才会变成真实的 DOM 。根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff ,它可以极大提高网页的性能表现。 4、

  • react prop-types 检测类型

  • nvd3,编写svg图形代码

对于代码的修改最好先在线平台操作学习,改完即可知道哪里变了

agular-nvd3arrow-up-right plnkrarrow-up-right vd3文档arrow-up-right

  • 对图表下钻开发, 需要对redux有所了解,需要知道redux的一些概念:

B站学习视频arrow-up-right demo学习arrow-up-right 根据文档创建demoarrow-up-right

  • State 数据,就是一个对象。redux中的state是不能直接修改的,只能通过action来修改,相当于我们在单例中定义setter方法。

  • Action redux 将每一个更改动作描述为一个action,要更改state中的内容,你需要发送action。一个action是一个简单的对象,用来描述state发生了什么变更。

上面这就是一个action,说白了就是一个对象,根据里面的type判断做什么操作。

  • Reducer 数据state,指示action都有了那么就是实现了。reducer就是根据action来对state进行操作。

    ```

    const calculate = (state: ReduxState = initData, action: Action ) => {

    switch (action.type) {

    }

    }

export {calculate}

import { createStore, combineReducers } from "redux"; import { calculate } from "./calculate";

// 全局你可以创建多个reducer 在这里统一在一起 const rootReducers = combineReducers({calculate}) // 全局就管理一个store export const store = createStore(rootReducers)

store.dispatch(incrementAction);

store.dispatch(async function(dispatch){ dispatch({ type:'', payload: })//派发一个action })

  • npm安装echarts-for-react npm install --save echarts-for-react npm install echarts --save

  • echarts体积巨大,使用模块化加载

  • 组件化开发的福音,react组件模块化加载

  • echarts-for-react 是一个非常简单的针对于ReaCt的Echarts封装插件

    用法:

    import ReactEcharts from 'echarts-for-react'

  • celery 并行分布式框架

    定时发送报表邮件功能用到,celery是python开发的分布式任务调度模块。

    celery本身不包含消息服务,而是利用第三方broker,可以用redis或mq,官方推荐mq。

    我们在superset中用的是redis,只需要简单的配置,然后启动celery即可。

    一些常用的命令如下:

    celery -A task worker --loglevel=DEBUG -P eventlet

    eventlet是在windows系统需要加上的

因为启动都是命令行查看,这里推荐一个监控工具flower, 安装非常简单pip install flower, 启动命令 在启动celery后执行 celery flower --address=0.0.0.0 --port=5555 --broker=redis://localhost:6379/1

Last updated