这篇文章主要介绍“Linkis JDBC是怎么适配Tableau”,在日常操作中,相信很多人在Linkis JDBC是怎么适配Tableau问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”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本身也是拓展用户群体的一种体现。
->“服务器”
->“更多”的列表中已经有了Linkis。
(2)查看数据库并提交Linkis任务
(1)定义JDBC展示属性的Manifest
<?xml version='1.0' encoding='utf-8' ?><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文件
<?xml version='1.0' encoding='utf-8' ?><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快捷方式中指定运行参数,这样就可以避免每次通过命令行启动。
到此,关于“Linkis JDBC是怎么适配Tableau”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/230422.html