superset使用心得
superset项目地址 github
安装运行
- No module named ‘gevent’
直接通过docker-compose方式执行
执行
docker-compose up
时,出现如下提示superset_1 | + '[' 0 -ne 0 ']' superset_1 | + '[' development = development ']' superset_1 | + cd superset/assets/ superset_1 | + npm ci superset_1 | + celery worker --app=superset.sql_lab:celery_app --pool=gevent -Ofair superset_1 | Traceback (most recent call last): superset_1 | File "/usr/local/bin/celery", line 10, in <module> superset_1 | sys.exit(main()) superset_1 | File "/usr/local/lib/python3.6/site-packages/celery/__main__.py", line 14, in main superset_1 | maybe_patch_concurrency() superset_1 | File "/usr/local/lib/python3.6/site-packages/celery/__init__.py", line 142, in maybe_patch_concurrency superset_1 | patcher() superset_1 | File "/usr/local/lib/python3.6/site-packages/celery/__init__.py", line 110, in _patch_gevent superset_1 | import gevent superset_1 | ModuleNotFoundError: No module named 'gevent'
解决措施
在 requirements-dev.txt 中加入geventflask-wtf==0.14.2 flask==1.0.2 geopy==1.11.0 gevent # 加入gevent gunicorn==19.8.0 humanize==0.5.1
- 项目初始化
sudo docker-compose run --rm superset ./docker-init.sh
此步骤会搭建superset的docker环境,并且通过docker-init.sh初始化项目,项目基础数据库(用于存放superset用户信息/权限信息/dashboard格式 等等)创建,在superset数据库中显示名称为main
ps:部署在其他地方的superset只要连接此基础数据库,将得到同样的内容展示
- 更换基础数据库
superset >
config.py
下有关于数据库链接的配置,默认使用python自带的sqlite# incubator-superset_copy/superset/config.py # The SQLAlchemy connection string. SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(DATA_DIR, 'superset.db') # SQLALCHEMY_DATABASE_URI = 'mysql://myapp@localhost/myapp' # SQLALCHEMY_DATABASE_URI = 'postgresql://root:password@localhost/myapp'
但是 contrib > docker >
superset_config.py
会覆盖配置# incubator-superset_copy/contrib/docker/superset_config.py POSTGRES_USER = get_env_variable('POSTGRES_USER') POSTGRES_PASSWORD = get_env_variable('POSTGRES_PASSWORD') POSTGRES_HOST = get_env_variable('POSTGRES_HOST') POSTGRES_PORT = get_env_variable('POSTGRES_PORT') POSTGRES_DB = get_env_variable('POSTGRES_DB') # The SQLAlchemy connection string. SQLALCHEMY_DATABASE_URI = 'postgresql://%s:%s@%s:%s/%s' % (POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB)
superset默认数据库为postgres,我公司线上部署了mysql,所以我改为了mysql数据库,
docker-compose.yml
文件中关于postgres的依赖也去除。
这样我在本地开发时做的图表和仪表盘,线上部署时只需要连接同一个mysql数据库,就能看到本地开发时所生成的图表# incubator-superset_copy/contrib/docker/superset_config.py # 用mysql存储superset内容信息 MYSQL_USER = get_env_variable('MYSQL_USER') MYSQL_PASSWORD = get_env_variable('MYSQL_PASSWORD') MYSQL_HOST = get_env_variable('MYSQL_HOST') MYSQL_PORT = get_env_variable('MYSQL_PORT') MYSQL_DB = get_env_variable('MYSQL_DB') # The SQLAlchemy connection string. SQLALCHEMY_DATABASE_URI = 'mysql://%s:%s@%s:%s/%s' % (MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, MYSQL_DB)
SQL Lab
- SQL查询语句
在0.28版本中, 支持如下表达,字段可加引号可不加:
SELECT country_code AS country_code, SUM(SP_RUR_TOTL_ZS) AS "sum__SP_RUR_TOTL_ZS" FROM ...
但是在新版本superset中则会出现报错
column "sp_rur_totl_zs" does not exist LINE 2: sum(SP_RUR_TOTL_ZS) AS "sum__SP_RUR_TOTL_ZS", ^
对于大写字母的字段需要加上引号:
SELECT country_code AS country_code, SUM("SP_RUR_TOTL_ZS") AS "sum__SP_RUR_TOTL_ZS" FROM ...
对于
[SELECT] ...AS...
操作,不通过SQL Lab也能实现,我们需要进入Tables选择我们要操作的表,在指标选项中加入需要的字段,如下:
选择添加按钮,SQL Expression
中为操作的sql表达式,Metric
为数据别名
相当于[select]SQL Expression
asMetric
Dashboards
- 编辑页面图表样式
直接进入
Dashboards
中打开一个仪表盘,会发现页面图片显示是每行3图,大小和位置固定官方文档提到可以直接拖拽改变图表大小位置,如下图所示,点图表右下角的小箭头进行大小调整
这里困扰了我很久,我一直以为自己装载文件出问题,并且尝试了不同版本,除了docker安装还试了本地直接配置,但是没有看到官方文档提到的直接拖拽图片点击图表右上角的那三个点可以对图表内容进行编辑。注意,这是无法调整图片大小和位置的
如果需要调整图表位置或大小,需要点击仪表盘右上角的Edit dashboard
(注意不是点小箭头)
页面右侧会出现如下内容:
如果需要返回视图界面,点击Switch to view mode
工具功能介绍
Your charts & filters
:这里可以查看自己的图表,选择图标后拖拽至指定位置(但建议先进行页面布局,然后再将图表拖拽至指定位置),下面是版面布局操作Tabs
:用于添加分页栏,将分页栏拖拽至你想分页的内容上,不仅可以对页面中部分展示模块进行分页,还能对整个展示页面进行分页,根据自己需求设计(下方为我在总栏下分了内容展示和展示说明页)
Row
:添加一行板块,实现的功能就是给其中某一模块下再加一行,可以是针对整个页面的整行,也可以是对小板块,反正你想加到哪,就把这个工具拖拽到哪个板块对应的边缘(上/下边缘),效果是列宽相等。
注意:ROW和COLUMNS工具都只是创建一个空的板块,需要自己再将图表拖拽到创建的板块中
Column
:操作上和Row
差不多,但是是多加一列,即左/右边缘上添加一个板块,效果是行高相等。Header
:给内容板块添加一行标题板块Markdown
:添加一个非图表板块,内容是Markdown格式Divider
:板块间添加一条横线,用于视图美观,便于区分页面板块
Charts
- 图表中数字格式调整
表中样式
添加数字格式方法
打开superset/assets/src/explore/controls.jsx
文件,找到const D3_FORMAT_OPTIONS
变量,加入自己需要的数字格式,如下我加入了“,”号分隔的整数/一位小数/两位小数// input choices & options const D3_FORMAT_OPTIONS = [ ['SMART_NUMBER', 'Adaptative formating'], ['.1s', '.1s (12345.432 => 10k)'], ['.3s', '.3s (12345.432 => 12.3k)'], [',.1%', ',.1% (12345.432 => 1,234,543.2%)'], ['.3%', '.3% (12345.432 => 1234543.200%)'], ['.4r', '.4r (12345.432 => 12350)'], [',.0f', ',.0f (12345.432 => 12,345)'], [',.1f', ',.1f (12345.432 => 12,350.4)'], [',.2f', ',.2f (12345.432 => 12,350.43)'], [',.3f', ',.3f (12345.432 => 12,345.432)'], ['+,', '+, (12345.432 => +12,345.432)'], ['$,.2f', '$,.2f (12345.432 => $12,345.43)'], ];
改后效果
遇见问题
- superset无法连接或打开和mysql有关的内容
在较新的superset中出现的问题,打开和mysql有关的看板或数据库时出现此提示
superset ModuleNotFoundError: No module named 'MySQLdb'
原因:
较新版本superset的requirements_dev.txt
文件中移除了mysqlclient==1.4.2.post1
和thrift==0.11.0
解决方法:
在requirements_dev.txt中加入mysqlclient==1.4.2.post1
和thrift==0.11.0
black==19.3b0 coverage==4.5.3 flake8-import-order==0.18.1 flake8-mypy==17.8.0 flake8==3.7.7 flask-cors==3.0.7 ipdb==0.12 mypy==0.670 mysqlclient==1.4.2.post1 nose==1.3.7 pip-tools==3.7.0 pre-commit==1.17.0 psycopg2-binary==2.7.5 pycodestyle==2.5.0 pyhive==0.6.1 pylint==1.9.2 python-dotenv==0.10.1 redis==3.2.1 statsd==3.3.0 thrift==0.11.0 tox==3.11.1