Linkis JDBC是如何适配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本身也是拓展用户群体的一种体现。
(2)查看数据库并提交Linkis任务
(1)定义JDBC展示属性的Manifest
<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>
(2)用于定制连接器对话框的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文件
<tdr class='linkis_jdbc'><connection-resolver><connection-builder><script file='connectionBuilder.js'/></connection-builder><connection-normalizer><required-attributes><setImpersonateAttributes/><attribute-list><attr>server</attr><attr>port</attr><attr>dbname</attr><attr>username</attr><attr>password</attr><attr>sslmode</attr></attribute-list></required-attributes></connection-normalizer><connection-properties><script file='connectionProperties.js'/></connection-properties></connection-resolver></tdr>
(4)定制SQL方言的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>
(5)连接器的构造器connectionBuilder
(function dsbuilder(attr) {var urlBuilder = "jdbc:linkis://" + attr[connectionHelper.attributeServer] + ":" + attr[connectionHelper.attributePort] + "/" + attr[connectionHelper.attributeDatabase];return [urlBuilder];})
(6)连接器的参数配置文件Connection Properties
(function propertiesbuilder(attr) {var props = {};props["user"] = attr[connectionHelper.attributeUsername];props["password"] = attr[connectionHelper.attributePassword];if (attr[connectionHelper.attributeSSLMode] == "require") {props["ssl"] = "true";props["sslmode"] = "require";}return props;})
(7)打包装入Tableau完成适配
上述路径和文件名是自定义的,不必和本文章完全一致,在启动时我们需要添加额外参数-DConnectPluginsPath=/Path定向加载适配文件。在CMD命令行中输入
E:\tableau\bin\tableau.exe -DConnectPluginsPath=C:\connectors
其中E:\tableau\bin\tableau.exe是Tableau的运行路径。也可以在Tableau快捷方式中指定运行参数,这样就可以避免每次通过命令行启动。
WeDataSphere,BIG DATA MADE EASY.
用心做一个有温度的开源社区
~欢迎关注~
扫码关注我们
微信号公众号 : WeDataSphere
GitHub:WeDataSphere
如果喜欢我们的产品或文章,请给我们的GitHub点上你宝贵的star和fork哦~~
欢迎加入我们的有奖征文活动哦,详见如下链接~
同时诚挚的希望您点开“阅读原文”,在OSC开源投票中,为Linkis与DataSphere Studio投上您宝贵的一票哦~~
本文分享自微信公众号 - WeDataSphere(gh_273e85fce73b)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

