Erlo

Linkis JDBC是如何适配Tableau的?

2020-11-11 14:30:10 发布   420 浏览  
页面报错/反馈
已收藏 点赞


目录

一、       背景介绍
二、       使用案例
(1)     连接数据源
(2)     查看数据库并提交Linkis任务
三、       兼容Tableau的具体实现
(1)     定义JDBC展示属性的Manifest
(2)     用于定制连接器对话框的tcd文件
(3)     用于解析连接器的tcr文件
(4)     定制SQL方言的tdd文件
(5)     连接器的构造器connectionBuilder
(6)     连接器的参数配置文件Connection Properties
(7)     打包装入Tableau完成适配
四、       实现总结
五、       参考文献
 


01

—

背景介绍


----为什么我们需要Linkis JDBC去兼容Tableau?

毫无疑问,Tableau在当今商业化BI产品中有着广泛的客户群体,很多商业机构使用Tableau进行数据分析和构建报表,支持Tableau的兼容方案可以使不懂java的数据分析人员依靠托拉拽的可视化方式向Linkis提交任务。无论对于用户还是Linkis,实现Tableau兼容都是非常值得去做的一件事。

对于用户来说,使用JDBC的开发人员必须掌握JDBC的使用方法,这种限制增加了分析人员的学习成本,为了丰富用户的使用场景,不仅仅依靠java api的方式去构建代码与Linkis互动,兼容可视化BI工具的想法应运而生,而Tableau正是这一想法的其中一个实现目标。

对于Linkis来说,Linkis项目诞生之时便有“连接一切”的愿景,实现丰富的底层计算存储组件的支持和满足多样的上层应用接入,通过JDBC的方式连接Linkis拓展了自身的适用场景,将Linkis JDBC适配Tableau本身也是拓展用户群体的一种体现。


----应该如何去实现这一目标?
Tableau中提供了大量的数据源支持,而这些支持都是需要驱动类来实现的,例如Mysql、Hive等数据库的JDBC Driver,只需要数据源厂商定制满足Tableau接口规范的模组文件就能在Tableau中制定可插拔的数据源连接器。
图2-1 Tableau中已经适配的数据源


02
—
使用案例

Tableau的适配方法在第三章中会详细介绍,在介绍适配方法之前,我们先来一起体验一下适配后的Tableau如何通过JDBC轻松地联动Linkis。

(1)连接数据源

在适配好了Tableau之后,我们启动Tableau,可以看到“连接” ->“服务器” ->“更多”的列表中已经有了Linkis。
图2-1 服务器列表中已经有了Linkis
点击后弹出对话框需要填写数据源的相关配置,包含服务器的主机IP、端口、数据库、用户名及密码。这里的主机ip需要填写部署Linkis的服务器ip,端口是gateway的服务端口,数据库是Hive的数据库,需要注意的是,用户名是具有访问Linkis权限的用户,而不是数据库的用户,因为本质上是用户名和密码需要经过gateway服务进行登录和权限校验。
图2-2 通过Linkis JDBC连接到Linkis
填写好相关数据点击登录即可。

(2)查看数据库并提交Linkis任务

登录后页面会自动跳转,左侧一栏展示当前数据库所有的Hive表信息
图2-3 登录后的使用界面
我们来试一下查询表的具体数据,这里使用的是testjohn1表,点击表右侧的按钮即可快速查询。
图2-4 查询表数据按钮
图2-5 查询结果
从图2-5可以看出,tableau已经成功提交SQL任务到Linkis执行,并将返回的结果集解析成表展示给用户。我们从dss(DataSphere Studio)的管理台可以查看到该任务的提交和执行情况。在后续linkis1.0的版本中也将可以通过linkis的管理台直接查看任务的提交和执行情况。
图2-6 dss管理台任务执行情况
这里介绍了在Tableau使用Linkis JDBC提交任务到Linkis的具体案例,用户可以实现零代码编写使用Linkis,下面将介绍Tableau兼容方案的具体实现方式,会较为详细地介绍文件的作用和生成细节。


03
—
兼容Tableau的具体实现

为了实现将Linkis的JDBC驱动加入到服务器列表中实现适配,我们需要自定义修改Tableau的适配文件,适配文件包含Manifest(.xml文件)、Tableau Custom Dialog file(.tcd文件)、Tableau ConnectionResolver file(.tcr文件)、Tableau Dialect file(.tdd)、connectionBuilder(.js文件)以及Connection Properties(.js文件)这六个文件[2],下面将逐一介绍。

(1)定义JDBC展示属性的Manifest

Manifest文件的主要作用是用于定义连接器名字,用于在可用的数据源UI页面展示给用户,该文件对于每个客制化连接器来说是必选的,同样地,在linkis的JDBC方案中,该文件也进行了修改与适配。

connector-plugin class='linkis_jdbc' superclass='jdbc' plugin-version='1.0' name='Linkis (JDBC)' version='2020.1.0'>  vendor-information>    company name="Linkis"/>    support-link url="https://github.com/WeBankFinTech/Linkis"/>  vendor-information>  connection-customization class="linkis_jdbc" enabled="true" version='2020.1.0'>    vendor name="linkis"/>    driver name="Linkis JDBC Driver"/>    customizations>      customization name="CAP_JDBC_METADATA_READ_PRIMARYKEYS" value="no"/>      customization name="CAP_JDBC_METADATA_READ_FOREIGNKEYS" value="no"/>      customization name="CAP_JDBC_QUERY_ASYNC" value="yes"/>      customization name="CAP_JDBC_QUERY_CANCEL" value="yes"/>      customization name="CAP_FAST_METADATA" value="yes"/>      customization name="CAP_SELECT_INTO" value="no"/>      customization name="CAP_SELECT_TOP_INTO" value="no"/>      customization name="CAP_CREATE_TEMP_TABLES" value="no"/>      customization name="CAP_QUERY_BOOLEXPR_TO_INTEXPR" value="no"/>      customization name="CAP_QUERY_GROUP_BY_DEGREE" value="no"/>      customization name="CAP_QUERY_SORT_BY_DEGREE" value="no"/>      customization name="CAP_QUERY_SUBQUERIES" value="yes"/>      customization name="CAP_QUERY_TOPSTYLE_LIMIT" value="yes"/>      customization name="CAP_QUERY_WHERE_FALSE_METADATA" value="yes"/>      customization name="CAP_QUERY_SUBQUERIES_WITH_TOP" value="yes"/>      customization name="CAP_SUPPORTS_SPLIT_FROM_LEFT" value="yes"/>      customization name="CAP_SUPPORTS_SPLIT_FROM_RIGHT" value="yes"/>      customization name="CAP_SUPPORTS_UNION" value="yes"/>      customization name="CAP_QUERY_ALLOW_PARTIAL_AGGREGATION" value="no"/>      customization name="CAP_QUERY_HAVING_REQUIRES_GROUP_BY" value="yes"/>    customization name='CAP_JDBC_SUPPRESS_ENUMERATE_DATABASES' value='yes' />    customization name='CAP_JDBC_SUPPRESS_ENUMERATE_SCHEMAS' value='yes' />    customization name='CAP_QUERY_TOP_N' value='no' />    customizations>  connection-customization>   connection-dialog file='connection-dialog.tcd'/>  connection-resolver file="connectionResolver.tdr"/>  dialect file='dialect.tdd'/>connector-plugin>

其中class的标签值必须是唯一的,可以用于其他连接器中.xml文件的寻址、客制化定制以及Tableau工作簿中匹配连接器。
name值在Tableau 连接器窗格中显示连接器名称,还可以指定供应商信息。
company name用于在Tableau 连接器窗格中的连接器名旁边显示,可以展示连接器的创建者,也就是connector name by company name,例如Linkis JDBC Driverby linkis。
customizationname主要用于定制Linkis中JDBC的功能。

(2)用于定制连接器对话框的tcd文件

Tableau CustomDialog file即tcd文件,该文件是可选的,主要用于定制连接器对话框的内容。

   
   

(3)用于解析连接器的tcr文件

解析器tcr用于Tableau创建连接时寻找Connection文件,配置如下:

tdr class='linkis_jdbc'>  connection-resolver>    connection-builder>      script file='connectionBuilder.js'/>    connection-builder>    connection-normalizer>      required-attributes>        setImpersonateAttributes/>        attribute-list>          attr>serverattr>          attr>portattr>          attr>dbnameattr>          attr>usernameattr>          attr>passwordattr>          attr>sslmodeattr>        attribute-list>      required-attributes>    connection-normalizer>    connection-properties>      script file='connectionProperties.js'/>    connection-properties>  connection-resolver>tdr>

‍


这里指定了connection-builder和connection-properties的文件名,以及连接器连接时的必要属性,Tableau会将用户填写的这些数据信息组装成URL字符串用于建立连接。

(4)定制SQL方言的tdd文件

SQL方言是指的不同数据库之间的命令字不同,为了使Tableau兼容数据源,需要对数据源的方言进行转换,由于篇幅原因,这里只列出部分tdd文件的数据:

dialect name='HiveDialectSDK'         base='HiveDialect'         class='linkis_jdbc'         version='18.1'>  function-map> function group='numeric' name='LN' return-type='real'>      formula>(CASE WHEN %1 > 0 THEN LN(%1) ELSE CAST(NULL AS DOUBLE) END)formula>      argument type='real' />    function>    function group='numeric' name='LOG' return-type='real'>      formula>(CASE WHEN %1 > 0 THEN LOG10(%1) ELSE CAST(NULL AS DOUBLE) END)formula>      argument type='real' />    function>    function group='numeric' name='LOG' return-type='real'>      formula>(CASE WHEN %1 > 0 THEN LOG10(%1) / LOG10(%2) ELSE NULL END)formula>      argument type='real' />      argument type='real' />    function>    function group='numeric' name='MAX' return-type='real'>      formula>(CASE
	WHEN (%1 IS NULL) OR (%2 IS NULL) THEN NULL
	WHEN %1 > %2 THEN %1
	ELSE %2 END)formula>      argument type='real' />      argument type='real' />    function>    function group='numeric' name='MAX' return-type='int'>      formula>(CASE
	WHEN (%1 IS NULL) OR (%2 IS NULL) THEN NULL
	WHEN %1 > %2 THEN %1
	ELSE %2 END)formula>      argument type='int' />      argument type='int' />    function>  function-map>dialect>
完整的SQL方言文档可以参考
https://github.com/tableau/connector-plugin-sdk/blob/master/samples/plugins/postgres_jdbc/dialect.tdd

(5)连接器的构造器connectionBuilder

Tableau使用连接构造器(Linkis JDBC中的脚本名为connectionBuilder.js)创建JDBC连接URL的字符串,脚本映射定义连接配置方式的属性,在这里数据库地址、端口、以及数据库名构造成JDBC连接字符串传给驱动程序。
文件具体内容如下:

(function dsbuilder(attr) {    var urlBuilder = "jdbc:linkis://" + attr[connectionHelper.attributeServer] + ":" + attr[connectionHelper.attributePort] + "/" + attr[connectionHelper.attributeDatabase];
return [urlBuilder];})

‍


(6)连接器的参数配置文件Connection Properties

该参数配置文件是可选的,仅仅当数据
登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

浏览 2967.05 万次 点击这里给我发消息

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认