目錄
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)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。