本文
本文是metbase的高级技巧分享,主要包括:geojson导入和图表,动态sql执行, 动态过滤,动态分组,动态列
metabase中使用geojson
为了呈现下图中的按地区归属的用户数信息:

操作步骤
1,加入metabase geo json地址:
点击右上角admin settings-》settings -> Maps --> Add a map:

这里需要一个url,我们可以从安利云的datav里面获取:
访问: https://datav.aliyun.com/portal/school/atlas/area_selector
选择合适的地理位置(比如我只关心四川省的)

拷贝这里的geojson的url即可:
https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=510000_full
2、创建相关的dashboard
假设我有一个user表:
create table user(
id int primary key,
province_id int,
city_id int,
name varchar
);
如下的查询统计用户地区及用户数:
select city_id, count(*) from user
where province_id = 510000 and city_id is not null
GROUP BY city_id
选择visulation -》 maps, 然后勾选region map为前面创建的即可

复杂SQL执行
在metabase中原生不支持多语句的sql执行gitub讨论,但是如果真的是较复杂的业务 需要使用到sql编写的场景,则依赖手动修改实现。
本文描述了一种方法让metabase支持多行sql执行,并获取最后一个结果集作为最终结果集。
该方法修改了mysql底层的mariadb driver以支持多语句执行效果:github
主要代码在:ProxyedSqlComponent.java
然后
(1)替换metabase.jar 中的相关driver类即可:
已经构建好的镜像:(使用方式同:https://blog.youkuaiyun.com/scugxl/article/details/150004029)
docker pull edwardg/metabase:v0.54.9.1
示例的dockerfile:
FROM metabase/metabase:v0.54.9
# 安装zip工具
USER root
RUN apk update && apk add --no-cache zip
# 创建临时工作目录
WORKDIR /tmp
COPY mariadb-java-client-2.7.10.jar mariadb-java-client-2.7.10.jar
# 使用单层RUN命令进行所有操作
RUN unzip /app/metabase.jar -d metabase-extracted && \
unzip /tmp/mariadb-java-client-2.7.10.jar -d mariadb-extracted && \
cp -r mariadb-extracted/org/mariadb/jdbc/Driver* metabase-extracted/org/mariadb/jdbc/ && \
cp -r mariadb-extracted/org/mariadb/jdbc/ProxyedSqlComponent* metabase-extracted/org/mariadb/jdbc/ && \
cd metabase-extracted && \
zip -r /app/metabase.jar ./* && \
rm -rf /tmp/metabase-extracted /tmp/mariadb-extracted /tmp/mariadb-java-client-2.7.10.jar
# 恢复工作目录
WORKDIR /app
(2)在database configuration中加入 allowMultiQueries=true

复杂sql测试
假设我添加了1个filter,指定不同的group by, 然后按group by auth status 的话 就有 auth status, count(id) 2列, 如果group by org_id 的话就有province_id, city_id, count(id) 3列, 注意到我们这里实现了一个不同的groupby有不同列的效果,都是动态的, 那么sql如下:
-- 动态排序(添加ORDER BY clause)
SET @group_by_field = {{group_field}};
-- 拼接动态SQL(包含过滤和排序)
SET @sql = CONCAT(
'SELECT ',
CASE @group_by_field
WHEN 'org_id' THEN '`province_id` AS `省`, `city_id` AS `市`, count(*) AS `count`'
WHEN 'auth_status' THEN '`auth_status` AS `认证状态`, count(*) AS `count`'
END,
' FROM `user` ',
-- 动态过滤
-- 动态分组
'GROUP BY ',
CASE @group_by_field
WHEN 'org_id' THEN '1,2'
WHEN 'auth_status' THEN '1'
END
);
-- 预处理SQL(将@sql转换为可执行的语句)
PREPARE stmt FROM @sql;
-- 执行预处理语句
EXECUTE stmt
那么效果如下:


通过这样的效果,你可以实现任意复杂的sql统计和filter的关联组合。
总结
在本文我们介绍了geojson和分享了多语句sql在metabase中的一种hack方式。 这里是metabase系列文章的高级技巧部分。 下个博客我们介绍如何分享dashboard.

3290

被折叠的 条评论
为什么被折叠?



