提问
 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,极速登录

妙用FineDirect内存化解决kylin报错问题

帆软-Royide 社区微信达人帆软员工 版主
发表于 2018-3-2 10:58:37 | 显示全部楼层 |取消关注该作者的回复
一、关于内存化
截图201803021007104588.png
         熟悉FineBI中FineDirect数据引擎的童鞋们应该都知道,勾选内存化的数据表可以将数据库中的数据同步到服务器内存中,而FineDirect数据引擎中的内存化功能主要用于解决和处理直连跨数据源关联问题以及大数据量join性能较低的问题。除了这两大场景之外,FineDirect直连引擎中的内存化功能其实还有着许许多多的妙用,今天就给大家分享一个通过FineDirect直连引擎内存化解决kylin数据库报错的问题。
二、详细场景
截图201803021012058848.png
        kylin数据库在处理大数据量的数据时,其性能往往表现较好,故而我们企业如果有kylin这一类大数据平台时,往往会选择使用FineDirect直连数据引擎进行实时对接数据分析。我们先来看到上图中的数据统计情况,其他组件中的数据都正常计算出来了,但预览模板时右上方统计的“一年未报企业数前五地区”的kylin数据统计却报错了(编辑模板时正常显示图表数据),我们展开报错信息可以简单判断是SQL执行失败了。看到报错不用慌~这边为了更加清晰地进行分析,我们将该SQL拷贝出来看看。
  1. select T_C84177.AREANAME,sum(T_C84177.CNT)
  2. from (select s.areaname,s.cnt
  3. from (select a.areaname,o.cnt
  4. from (select ownid,count(*) as cnt
  5. from kl.nbn n
  6. left join sjtbk.a_bm_area a on n.regorg=a.areaid
  7. where noreport=1 and n.ancheyear='2016' group by ownid) o
  8. left join (select a.ownid,a.areaname from sjtbk.a_bm_area a where substring(a.areaid,5)='00') a
  9. on o.ownid = a.ownid)s)T_C84177
复制代码
       首先对于我们在做仪表板数据图表分析之前,添加SQL数据集的时候我们知道,当时预览的SQL是没有问题的,也就是嵌套SQL内部的部分执行时没有问题的:
  1. select s.areaname,s.cnt
  2. from (select a.areaname,o.cnt
  3. from (select ownid,count(*) as cnt
  4. from kl.nbn n
  5. left join sjtbk.a_bm_area a on n.regorg=a.areaid
  6. where noreport=1 and n.ancheyear='2016' group by ownid) o
  7. left join (select a.ownid,a.areaname from sjtbk.a_bm_area a where substring(a.areaid,5)='00') a
  8. on o.ownid = a.ownid)s
复制代码
       此时我们大概心中有数了,也就是因为外面嵌套的部分影响了整个SQL的执行。对于一般mysql或者oracle数据库来说,其实这段sql语句是没有什么语法问题的。但是现在连接的是kylin数据库,是否还是没有问题呢?对kylin数据库熟悉的小伙伴们应该都知道一点,在kylin数据库中是不能对join之后的结果集再做sum...group by操作的,也就是对拼接之后的结果集不能再做聚合操作。那么怎么办呢,这种情况下,是不能使用FineDirect直连引擎就束手无策了呢?

三、解决方案
        其实到这里我们就要有一个解决问题的思路,问题是因为kylin数据库不允许对join之后的结果集再做sum...group by操作,那么不做数据库层面的join操作,将原本需要在数据库中执行的join用FineDirect直连引擎提供的内存化功能来处理显然就能够解决问题了,这边我们将刚刚需要计算统计的SQL拆分为两个子SQL数据集来进行处理。
        SQL1:
  1. select ownid,count(*) as cnt
  2. from kl.nbn n
  3. left join sjtbk.a_bm_area a
  4. on n.regorg=a.areaid
  5. where noreport=1 and n.ancheyear='2016'
  6. group by ownid
复制代码
       SQL2:
  1. select a.ownid,a.areaname
  2. from sjtbk.a_bm_area a
  3. where substring(a.areaid,5)='00'
复制代码
       然后在FineDirect引擎中将SQL数据集1和SQL数据集2通过ownid进行N:1的关联,同时将SQL数据集2勾选内存化处理即可(将SQL数据集2中的数据抽取到服务器内存中然后再和SQL数据集1进行关联)。保存业务包之后重新使用新的数据集字段制作该图表,接下来我们继续看经过刚才操作之后的FineDirect数据引擎的表现情况。
截图201803021053053987.png

        如上图所示,一切正常。怎么样,FineDirect直连引擎中小小的一个内存化功能却拥有着大大的能量,确实很强大吧?
编辑于 2018-3-2 11:08  
此帖共有 66 位番薯登录后查看
回复

使用道具 举报

星痕 社区微信达人番薯互助团队 文档共创团队 互助叫兽、助理编辑、VIP1
发表于 2018-3-2 11:06:48 | 显示全部楼层 |取消关注该作者的回复
老罗啊,
  1. 用于解决贺处理直连跨数据源关联问题
复制代码
中的架应该是jar吧???还有就是赶紧加我个QQ2213370159
  收起(4)
  • 帆软-Royide 帆软-Royide 不是老早就加过你么,青崖白鹿。
    2018-03-02 11:09 评论
  • 星痕 星痕 : 回复 帆软-Royide :这就尴尬了,我那会直接搜你的英文名没找到
    2018-03-02 11:10 评论
  • 帆软-Royide 帆软-Royide
    2018-03-02 11:11 评论
  • 星痕 星痕 : 回复 帆软-Royide :
    2018-03-02 11:26 评论
  • 评论

回复 支持 反对

使用道具 举报

shalor 社区微信达人帆软员工 浪迹天涯(Lv4)
发表于 2018-3-2 13:48:16 | 显示全部楼层 |取消关注该作者的回复
  收起(1)
  • 帆软-Royide 帆软-Royide
    2018-03-02 17:29 评论
  • 评论

回复 支持 反对

使用道具 举报

传说哥 社区微信达人实名认证 番薯互助团队 帆软员工 管理员
发表于 2018-3-2 14:24:26 | 显示全部楼层 |取消关注该作者的回复
虽然看不懂,但感觉很厉害的样子
  收起(1)
  • 帆软-Royide 帆软-Royide 不明觉厉~
    2018-03-02 17:29 评论
  • 评论

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

联系管理员@兔子酱|联系帆软|免责声明|手机版|帆软社区|Copyright © 帆软软件有限公司 ( 苏ICP备14031611号-3 )

GMT+8, 2018-12-10 08:18 , Processed in 0.360919 second(s), 97 queries , Gzip On.

返回顶部 返回列表