kylin与superset集成实现数据可视化

大数据 智能网 浏览

小编:Apache kylin是一个开源分布式引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据。而superset是

Apache kylin是一个开源分布式引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据。而superset是airbnb开源的一款数据可视化工具。

kylin在超大数据规模下仍然可以提供秒级甚至毫秒级sql响应的OLAP多维分析查询服务。而且对服务器内存的要求也不像spark sql那么高,经过多方面的优化,数据膨胀率甚至可以控制在100%以内。它利用hive做预计算,然后建立多维的数据立方体,并存在hbase中,从而提供了实时查询的能力。

superset也就是早先的caravel,提供了丰富的图表供用户配置。只要连上数据源,勾几个简单的配置,或者写点sql。用户就可以轻易的构建基于d3、nvd3、mapbox-gl等的炫酷图表。

kylin与superset集成实现数据可视化

我厂也是选择了kylin和superset,遗憾的是superset支持多种数据源,包括druid、hive、impala、sparkSQL、presto以及多种主流关系型数据库,但是并不支持kylin。于是我们对其进行了改进。

首先观察superset的源码,它后台使用Flask App Builder搭建的,数据访问层用sqlalchemy实现。也就是说,它本质上可以支持所有数据源,只要实现一套kylin的dialect即可。而同时github上有一个pykylin项目,就是实现的这个dialect。这极大增强了我解决这个问题的信心。

正好前几周,superset出了一个新的prod版本airbnb_prod.0.15.5.0。装好它和pykylin之后,导入kylin数据源,成功!

kylin与superset集成实现数据可视化

但是点开sqllab想敲点sql验证一下时,却出了异常。

kylin与superset集成实现数据可视化

Debug了pykylin代码,发现get_table_names方法的入参connection实际已经是sqlalchemy的Engine对象了,这可能是最新sqlalchemy的版本升级造成的。总之,将原来的代码:

  • 改成:

    即可。

    顺便我们看到这里它扩展了sqlalchemy的list_tables方法,sqllab左上方的table选择区还有列出所有schema的下拉框,于是我们顺带把list_schama方法也实现。connection.py添加:

    dialect.py添加:

    之后执行sql还是有错:

    kylin与superset集成实现数据可视化

    pykylin在每次调用kylin的api时会首先登录,以获得JSESSIONID,并存入cookie中,这里是登录失败,检查代码,发现这里问题还挺多的,首先proxy.py中的login方法作者写的是self.password = user应改成password。dialect.py中create_connect_args方法改为:

    这样大部分sql查询没有问题,但是有的查询结果有部分值是null,这样也会出错。修改cursor.py的_type_mapped方法:

    这样在sqllab中执行sql基本没问题了。

    kylin与superset集成实现数据可视化

    下一步开始自定义slice,定制自己的可视化dashboard。

    在这里再次遇到问题,superset会自动把count函数计算的列设置别名叫count,而count是kylin的关键字,因此导致查找失败。修改superset的models.py的sqla_col方法:

    另外在slice中还经常会遇到pandas抛出的KeyError异常。这是因为在superset里面所有的关键字都是小写,然而kylin返回的所有的数据metadata全是大写,导致superset在kylin的返回结果中查询关键字的时候出现找不到关键字的错误。

    修改pykylin的cursor.py的execute方法。

    最后,我发现在查找的字段包含kylin中的date类型时也会出错。点击slice页面右上角的query按钮,可以查看superset最终发送的sql。

    kylin与superset集成实现数据可视化

    将它直接拷贝到kylin的insight页面去执行,发现报错。原来kylin的date类型只支持年月日,而superset在添加日期搜索条件时为了实现定时刷新图表而在sql的日期条件中都精确到了时分秒。关于一分快三这个我原先是在superset中做了修改。

    在superset的models.py的get_query_str方法中:

  • time_filter = dttm_col.get_time_filter(from_dttm, to_dttm) 
  • 改为

    添加get_date_filter,dt_sql_literal函数:

    这样对于所有kylin数据源的查找时间范围条件都将转为年月日的格式。

    不过我一直感觉这个改动不是很完美,是一种典型的打补丁的做法。后来我发现superset支持在列的设置页面为一个日期列添加自定义的格式转换函数

    kylin与superset集成实现数据可视化

    于是我在这里设置日期列格式

  • TO_DATE(‘{}’, ‘yyyy-MM-dd’) 
  • 然后可以看到slice这里sql中的该列都变成了to_date函数形式

    kylin与superset集成实现数据可视化

    最后的工作就是修改kylin源码,添加对日期函数的支持。hive sql是支持to_date等日期格式转换函数的,kylin凭什么不支持?

    当前网址:www.fklidushit.com/tutorials/dashuju/2017/0420/1042.html

     
    你可能喜欢的: