Linkis JDBC是如何适配Tableau的?

Stella981
• 阅读 652

目录

一、 背景介绍

二、 使用案例

(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中制定可插拔的数据源连接器。

Linkis JDBC是如何适配Tableau的?

图2-1 Tableau中已经适配的数据源

02

使用案例

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

(1)连接数据源

在适配好了Tableau之后,我们启动Tableau,可以看到“连接” ->“服务器” ->“更多”的列表中已经有了Linkis。

Linkis JDBC是如何适配Tableau的?

图2-1 服务器列表中已经有了Linkis

点击后弹出对话框需要填写数据源的相关配置,包含服务器的主机IP、端口、数据库、用户名及密码。这里的主机ip需要填写部署Linkis的服务器ip,端口是gateway的服务端口,数据库是Hive的数据库,需要注意的是,用户名是具有访问Linkis权限的用户,而不是数据库的用户,因为本质上是用户名和密码需要经过gateway服务进行登录和权限校验。

Linkis JDBC是如何适配Tableau的?

图2-2 通过Linkis JDBC连接到Linkis

填写好相关数据点击登录即可。

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

登录后页面会自动跳转,左侧一栏展示当前数据库所有的Hive表信息

Linkis JDBC是如何适配Tableau的?

图2-3 登录后的使用界面

我们来试一下查询表的具体数据,这里使用的是testjohn1表,点击表右侧的按钮即可快速查询。

Linkis JDBC是如何适配Tableau的?

图2-4 查询表数据按钮

Linkis JDBC是如何适配Tableau的?

图2-5 查询结果

从图2-5可以看出,tableau已经成功提交SQL任务到Linkis执行,并将返回的结果集解析成表展示给用户。我们从dss(DataSphere Studio)的管理台可以查看到该任务的提交和执行情况。在后续linkis1.0的版本中也将可以通过linkis的管理台直接查看任务的提交和执行情况。

Linkis JDBC是如何适配Tableau的?

图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方案中,该文件也进行了修改与适配。

<?xml version='1.0' encoding='utf-8' ?>

其中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文件,该文件是可选的,主要用于定制连接器对话框的内容。

`<connection-dialog class='linkis_jdbc'>`


` <connection-config>`


` <authentication-mode value='Basic' />`


` <authentication-options>`


` <option name="UsernameAndPassword" default="true" />`


` </authentication-options>`


` <db-name-prompt value="Database: " />`


` <has-pre-connect-database value="true" />`


` <port-prompt value="Port: " default="9001" />`


` <show-ssl-checkbox value="true" />`


` </connection-config>`


`</connection-dialog>`

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

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

<?xml version='1.0' encoding='utf-8' ?>

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

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

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

<dialect name='HiveDialectSDK'

完整的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) {

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

该参数配置文件是可选的,仅仅当数据源驱动是JDBC时才需要(Linkis JDBC中的脚本名为connectionProperties.js),用于构建URL最后的参数设置。

(function propertiesbuilder(attr) {

(7)打包装入Tableau完成适配

方法一:自定义连接器插件装载路径(已验证可行)

首先我们将前面六个文件装入目录linkis_jdbc目录(该目录名应该和Mainfest中的class='linkis_jdbc'是一致的),该目录位于C:\connectors,文件目录层级如下图所示:

Linkis JDBC是如何适配Tableau的?

图3-1 适配文件路径

上述路径和文件名是自定义的,不必和本文章完全一致,在启动时我们需要添加额外参数-DConnectPluginsPath=/Path定向加载适配文件。在CMD命令行中输入

E:\tableau\bin\tableau.exe  -DConnectPluginsPath=C:\connectors

其中E:\tableau\bin\tableau.exe是Tableau的运行路径。也可以在Tableau快捷方式中指定运行参数,这样就可以避免每次通过命令行启动。

Linkis JDBC是如何适配Tableau的?

图3-2 指定运行参数

方法二:通过官方文档构建(尝试过未成功,可能方法有误)

该种方法是通过构造.taco文件存入Tableau的数据源根目录,实现具体方法可以参考[1] 。

我们通过第一种方法完成了适配,在适配好了Tableau之后,我们启动Tableau,可以看到“连接”->“服务器”->“更多”的列表中已经有了Linkis JDBC。

Linkis JDBC是如何适配Tableau的?

图3-3 适配成功

04

实现总结

Tableau作为一款受众面极广的商业BI软件,兼容Tableau可以使Linkis的适用性更广,用户可以通过Linkis在Tableau上实现底层spark集群的SQL请求。Tableau为数据源服务商提供了一套完整的接口方案,方便服务商定制属于自己的数据源驱动的适配文件,只需要服务商根据自身驱动的特性适当地修改,即可方便地完成适配过程,整个适配流程也遇到了一些困难,通过查看Tableau的日志和其他产品的兼容方案[3]才得以解决。

我们也将在未来对Linkis做更多的适配内容,欢迎广大社区用户加入到Linkis的开源建设工作中,我们也将极力提供应有的支持。

05

参考文献

[1] 使用 Tableau Connector SDK 組建的連接器外掛程式

https://help.tableau.com/current/pro/desktop/zh-tw/examples\_connector\_sdk.htm

[2] connector-plugin-sdk

https://github.com/tableau/connector-plugin-sdk

[3] tableau-qubole-connector

https://github.com/qubole/tableau-qubole-connector/tree/master/Hive/qubole\_hive

WeDataSphere,BIG DATA MADE EASY.

用心做一个有温度的开源社区

欢迎关注

Linkis JDBC是如何适配Tableau的?

扫码关注我们

微信号公众号 : WeDataSphere

GitHub:WeDataSphere

如果喜欢我们的产品或文章,请给我们的GitHub点上你宝贵的star和fork哦~~

欢迎加入我们的有奖征文活动哦,详见如下链接~

【有奖征文】我有酒,你有故事吗?

同时诚挚的希望您点开“阅读原文”,在OSC开源投票中,为Linkis与DataSphere Studio投上您宝贵的一票哦~~****_Linkis JDBC是如何适配Tableau的? _

本文分享自微信公众号 - WeDataSphere(gh_273e85fce73b)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这