经过前面的步骤,我们已经成功搭建好了数据库,将csv文件中的数据导入到clickhouse中,并将superset和clickhouse成功地连接起来了。现在我们就可以对我们的数据尝试提出一些实际业务问题,使用SQL查询出我们想要的数据结果,并将其可视化为报表形式保存在superset上。
我们不妨从以下几个问题入手:
由于SQL比较简单,不做多余解释,看代码就行。重点说明如何将SQL查询保存为数据报表(slice)的过程。
在SQL Editor中输入:
SELECT sum(trip_miles ) as trip_miles , taxi_id
FROM TAXI_TRIPS
GROUP BY taxi_id
order by trip_miles DESC
limit 100
点击Run Query
,等待服务器返回结果。点击Save Query
保存当前查询。
接下来我们将查询结果保存到superset。
点击Explore
按钮,页面将跳转到数据切片的详细设置页面,
①数据源设置
点击数据源设置后,可以看到数据源对应的SQL,因为数据源的名称并不容易记住,我们首先将其修改为更直观的名称,点击Use Legacy DataSource Editor
切换回以前的数据源旧编辑器模式(新的我没找到在哪里修改数据源名称),
修改后保存即可。
回到新版的旧编辑器,在Metrics
标签页里,superset为我们自动生成了一个聚合指标count(*),表示记录条数,我们可以自定义生成其他的指标。比如我们可以生成一个出租车里程数的SUM聚合指标,并且将其名称标记为trip_miles。
这里有个坑,要是直接在刚才的可视化界面将Metrics设置为trip_miles,superset会提示一定要将这个量值聚合后才能用于图表构建,而构建后的图表指标名称就变成了SUM(trip_miles),但是我们见到的大多数图表并不会这样标注,通常会直接标注里程数(trip_miles),因此SUM(trip_miles)并不直观,为人们好理解。现在也没有太好的解决方案,只能暂时通过这种创建量值的方式让图表显示trip_miles。
②报表类型
但值得一提的一点是,line chart在superset 0.34.0版本中支持x轴为时间/日期的数据框,其他x轴不为时间/日期类型的不能使用line chart,作者解释这样子设计的意思是x轴非时间类型的数据框可以用bar chart实现我们想要的效果。
因此这里我们选择bar chart。
回到设计界面,需要注意的是这里有另外一个坑,Time项目中Time Range被默认筛选到了Last Week,这个会导致SQL查询无结果,需要将其设定到No filter状态。
③聚合列
此处指定taxi_id作为聚合列。
④指标
此处是我们刚才创建的指标trip_miles。点击Run Query就可以看到设计好的图表。
实际上superset这样子的设计我感觉更使用于粒度中等的SQL返回结果,粒度中度意味着不把底层数据表全量返回,同时又可以对量值做不同类型的聚合计算,COUNT\SUM\MAX等等;但是这样子带来的问题是在写SQL的时候就得想好指标的聚合需要怎么设计,粒度不好把控。
接下来我们将其保存到Dashboard。点击左上角的Save
,在Save as
中填入图表名称,在Add to new dashboard
中填入新建的仪表板名称。
根据选择的图表类型不同,图表设计界面可能有不同的Option,比如:
⑤排序依据
指定图表排序依据的列或者聚合(?)
⑥升降序
排序升降序(DESC\ASC)
以下问题同理,为了方便就不写具体过程,只写出对应的SQL,以供参考。
SELECT
AVG(a.n_taxis) AS avg_n_taxis,
a.hour
from
(
SELECT
toDate(trip_start_timestamp) as date,
toHour(
toDateTime(trip_start_timestamp)
) as hour,
count(distinct taxi_id) as n_taxis
FROM
TAXI_TRIPS
group by
date,
hour
) a
group by
a.hour
SELECT
taxi_id,
avg(trip_seconds) / 60 as avg_trip_minutes
from
TAXI_TRIPS
GROUP BY
taxi_id
order by
avg_trip_minutes desc
limit 1000
SELECT
COUNT(DISTINCT taxi_id) as n_taxis,
toDate(trip_start_timestamp) as date
FROM
TAXI_TRIPS
GROUP BY
date
SELECT
COUNT(DISTINCT trip_id ) as n_trips,
toDate(trip_start_timestamp) as date
FROM
TAXI_TRIPS
GROUP BY
date
SELECT
SUM(toFloat32OrZero(substring(fare, 2))) as fare,
toDate(trip_start_timestamp) as date
FROM
TAXI_TRIPS
GROUP BY
date
SELECT
(
CASE
WHEN trip_miles >= 0
and trip_miles < 5 THEN 5
WHEN trip_miles >= 5
and trip_miles < 10 THEN 10
WHEN trip_miles >= 10
and trip_miles < 50 THEN 50
WHEN trip_miles >= 50
and trip_miles < 100 THEN 100
WHEN trip_miles >= 100
and trip_miles < 500 THEN 500
WHEN trip_miles >= 500
and trip_miles < 1000 THEN 1000
ELSE 10000
END
) AS miles_tag,
COUNT(DISTINCT trip_id) as n_trips
FROM
TAXI_TRIPS
GROUP BY
miles_tag