目录
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文件
(3)用于解析连接器的tcr文件
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>
(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];
})