接上文《K8S集群下安装superset基于mysql生成报表》
升级到最新版本
之前安装的Superset不支持修改配置参数,启动动态SQL能力,需要修改配置文件config.py(详细可参考官方文档https://superset.apache.org/docs/installation/sql-templating),但是之前映射的volume直视存放的db,并未将config.py落地到外部卷。因此做了如下步骤修正:
- 增加pv、pvc
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-superset-wv
labels:
name: pv-superset-wv
spec:
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /home/release/soft/nfs/superset-wv/
server: nfs-server-2
accessModes: ["ReadWriteMany"]
capacity:
storage: 5G
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-superset-wv
namespace: va
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5G
- 启用新的服务superset-wv
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: superset-wv
namespace: va
spec:
replicas: 1
selector:
matchLabels:
tier: superset-wv
matchExpressions:
- {key: tier, operator: In, values: [superset-wv]}
template:
metadata:
labels:
app: superset-wv
tier: superset-wv
spec:
containers:
- name: superset-wv
image: apache/superset
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8088
volumeMounts:
- name: sys-time
mountPath: /etc/localtime
- name: pvc-superset-wv
mountPath: /app/
nodeSelector:
scope: inner
volumes:
- name: sys-time
hostPath:
path: /etc/localtime
- name: pvc-superset-wv
persistentVolumeClaim:
claimName: pvc-superset-wv
---
apiVersion: v1
kind: Service
metadata:
name: superset-wv-service
namespace: va
spec:
ports:
- name: web
port: 8080
targetPort: 8088
selector:
tier: superset-wv
- 拷贝服务superset的/app内容到superset-wv对应的目录
kubectl apply -f superset-wv.yml
kubectl exec -it -n va superset.pod -- bash
cp -r /app/* $target
cd $target
chmod -R 777 $target/*
- 升级superset,保留以往配置的数据报表
pip install apache-superset --upgrade
superset db upgrade
superset init
修改配置参数
vi superset/config.py修改如下参数为True
#"ENABLE_TEMPLATE_PROCESSING": False,
"ENABLE_TEMPLATE_PROCESSING": True,
测试
打开SQL Lab编辑如下查询语句验证是否安装成功
select '{{ current_username() }} ',' {{ current_user_id()}} ',

输出下表示成功
应用
如此就可以借助这些动态参数,实现不同用户看到不同的视图。例如在一个dataset里面增加个性化SQL,

{% if current_user_id() == '1' %}
select * from v_device_list_with_merchant where merchant_name='M2021080001'
{% else %}
select * from v_device_list_with_merchant
{% endif %}
也可以按照url参数的不同输出不同的结果:
{% if url_param('cmd') %}
select * from v_device_list_with_merchant where merchant_name='{{ url_param('cmd') }}'
{% else %}
select * from v_device_list_with_merchant
{% endif %}
最后
还可以定义类似url_param的类似函数,不过我觉得基于url和用户就足够了。看看我的图:

http://bi-wv.my-soft.net.cn/superset/dashboard/2/?native_filters=%28%29
找找他们的不同:

http://bi-wv.my-soft.net.cn/superset/dashboard/2/?cmd=M2021090002&native_filters=%28%29