目錄
javascript
01java
—git
背景介紹github
----爲何咱們須要Linkis JDBC去兼容Tableau?sql
毫無疑問,Tableau在當今商業化BI產品中有着普遍的客戶羣體,不少商業機構使用Tableau進行數據分析和構建報表,支持Tableau的兼容方案可使不懂java的數據分析人員依靠托拉拽的可視化方式向Linkis提交任務。不管對於用戶仍是Linkis,實現Tableau兼容都是很是值得去作的一件事。數據庫
對於用戶來講,使用JDBC的開發人員必須掌握JDBC的使用方法,這種限制增長了分析人員的學習成本,爲了豐富用戶的使用場景,不只僅依靠java api的方式去構建代碼與Linkis互動,兼容可視化BI工具的想法應運而生,而Tableau正是這一想法的其中一個實現目標。api
對於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文件svg
<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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。