目录
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];})

