当前位置: 首页 > news >正文

毕业设计都是做网站吗有本地服务器怎么做网站

毕业设计都是做网站吗,有本地服务器怎么做网站,广州网站的建设公司,找网络公司做网站需要注意的当前的互联网数据仓库系统里#xff0c;数据中心往往存放了大量Cube化或者半Cube化的数据。如果需要将这些数据的内在关系体现出来#xff0c;需要写大量的程序和SQL来发现数据之间的内在规律#xff0c;往往会造成用户做非常多的重复性工作#xff1b;而且由于没有数据校验… 当前的互联网数据仓库系统里数据中心往往存放了大量Cube化或者半Cube化的数据。如果需要将这些数据的内在关系体现出来需要写大量的程序和SQL来发现数据之间的内在规律往往会造成用户做非常多的重复性工作而且由于没有数据校验的机制还容易出错无法直观查看各种数据没有可视化的UI图表。这时就急需一款基于Cube的报表工具快速为用户提供报表服务可以完成多维查询、上卷、下钻等各种功能。为此美团点评酒旅技术团队开发了大圣魔方。 一款好的BI报表工具需要考虑并能够解决如下问题 统一数据源SQL生成跨数据源数据聚合自定义计算指标数据权限标准化UI组件自助生成可视化报表体系架构 图1 大圣魔方体系架构 具体方案 1. 统一数据源 提供多数据源查询服务需要解决的问题主要是两个 以什么样的统一方式从数据源获取数据。不是所有的数据源引擎都能提供OLAP服务和数据聚合的能力我们需要从上层考虑去实现数据的聚合、上卷、下钻、切割、自定义计算等功能。 图2 大圣魔方多数据源 大圣魔方上对能够通过SQL查询的数据源例如MySQL和Kylin都通过统一SQL查询来获取数据对于ESElasticsearch采用ES提供的API来查询对于普通文本格式的数据采用自定义API从数据源获取数据。 如图2所示大圣魔方只是从数据源里面获取基础的数据之后通过实现自己的计算引擎对数据进行聚合、切割等操作对此魔方中设置了四个引擎用于实现不同的功能。 2. SQL生成 对于SQL的生成也存在两个问题 不是所有的支持SQL的数据源都支持标准的SQL同时支持标准SQL的数据源也会支持带有自身特征的SQL。根据用户选择的条件、维度和指标动态生成SQL的核心内容。针对第一个问题我们对SQL模板进行了定义当选择不同的数据源时根据数据源的Dialect选择不同的SQL模板而这就决定了SQL的组成部分骨架。 为了解决第二个问题我们在SQL模板的基础之上做了内容填充和替换操作选择具体的维度、指标和筛选项的值再填充到SQL模板的不同地方最终就会生成能够被数据源执行的SQL。 在SQL生成的时候也考虑过其它的框架如Apache Calcite Avatica、Alibaba的Druid但是最终都放弃了原因也是基于两个方面 这些框架庞大且功能多适用于我们场景的SQL生成的部分API使用起来过于复杂。大都是基于标准的ANSI SQL-92很难个性化地生成我们所需要的SQL。最终我们采用了SQL模板和字符串填充替换操作来完成。为此我们在Java的正则表达式基础之上做了一个功能很多的字符串操作类库。 3. 跨数据源数据聚合 一般情况下同一个数据源的大部分数据源引擎都能够支持多表的join操作但是也存在不支持的例如老版本的Kylin就不支持多Cube的join操作还有一个更重要的问题是数据源引擎无法解决跨数据源的数据聚合问题必须要自己实现数据的聚合操作一般的情况下需要自己去实现inner join、left outer join和full outer join的逻辑。 大圣魔方实现了inner join和left outer join两个逻辑因为full outer join的需求场景不是很多所以没有实现。下面是大圣魔方的实现代码 inner join核心代码 private void join(ListMapString,String[] contents,ListProject sharedList,final int n,int[] rowsStatus,LinkedListMatchRow result){if(this.cubeJoin1){throw new java.lang.IllegalArgumentException(left join call leftJoin method,not call join method);}if(ncontents.length){ListMapString,String list contents[n];for(int k0;klist.size();k) {boolean equal true;if(n!0) {MapString, String prev contents[n - 1].get(rowsStatus[n - 1]);MapString, String cur list.get(k);for (Project proj : sharedList) {String key proj.fieldName.toUpperCase();if (key.matches(^\\d$) || key.equals(*)) {key _;}key proj.isCompanion() ? key proj.getFactId() : key;String prevValue prev.get(key);String curValue cur.get(key);if (prevValue curValue) {continue;}if (prevValue null || curValue null || !prevValue.equals(curValue)) {equal false;break;}}}if (equal) {rowsStatus[n] k;if(ncontents.length-1){//last dataset matchMatchRow mr new MatchRow();ListMatchRow.DatasetRow tmp new ArrayList();for(int i0;irowsStatus.length;i){MatchRow.DatasetRow dr new MatchRow.DatasetRow();dr.setDatasetIndex(i);dr.setRowIndex(rowsStatus[i]);tmp.add(dr);}mr.addMatchRow(tmp);result.add(mr);}else{join(contents,sharedList,n1,rowsStatus,result);}}}}}上述代码就是通过回溯算法实现inner join的核心逻辑具体解析如下 contents参数表示每个数据源里面的结果集。sharedList表示关联的字段。n和rowsStatus是回溯算法记录状态用的。result里面包含的是符合join条件的记录。MatchRow里面记录的是一个数据源里面的某一行与其余的数据源里面的那一行是相等的记录的是下标号。只有当sharedList里面的每个字段都相等的时候两条记录才满足inner join的条件。这个算法是一个通用算法因为是通过回溯算法实现的所以要join的数据源理论上可以有无限个。 left outer join核心代码 private boolean leftJoin(ListMapString,String[] contents,ListProject sharedList,final int n,int[] rowsStatus,LinkedListMatchRow result){boolean leftJoinMatch false;if(ncontents.length){ListMapString,String list contents[n];for(int k0;klist.size();k) {boolean equal true;if(n!0) {//in left join,compare with the first dataset.MapString, String prev contents[0].get(rowsStatus[0]);MapString, String cur list.get(k);for (Project proj : sharedList) {String key proj.fieldName.toUpperCase();if (key.matches(^\\d$) || key.equals(*)) {key _;}key proj.isCompanion() ? key proj.getFactId() : key;String prevValue prev.get(key);String curValue cur.get(key);if (prevValue curValue) {continue;}if (prevValue null || curValue null || !prevValue.equals(curValue)) {equal false;break;}}}if (equal) {leftJoinMatch true;rowsStatus[n] k;if(ncontents.length-1){//last dataset matchMatchRow mr new MatchRow();ListMatchRow.DatasetRow tmp new ArrayList();for(int i0;irowsStatus.length;i){MatchRow.DatasetRow dr new MatchRow.DatasetRow();dr.setDatasetIndex(i);dr.setRowIndex(rowsStatus[i]);tmp.add(dr);}mr.addMatchRow(tmp);result.add(mr);}else{//if next dataset is not match,use the nexts next...for(int loopFlagn1;loopFlagrowsStatus.length;loopFlag){boolean match leftJoin(contents,sharedList,loopFlag,rowsStatus,result);if(match){break;}rowsStatus[loopFlag]-1;if(loopFlagcontents.length-1){MatchRow mr new MatchRow();ListMatchRow.DatasetRow tmp new ArrayList();for(int i0;irowsStatus.length;i){MatchRow.DatasetRow dr new MatchRow.DatasetRow();dr.setDatasetIndex(i);dr.setRowIndex(rowsStatus[i]);tmp.add(dr);}mr.addMatchRow(tmp);result.add(mr);}}}}}}return leftJoinMatch;} 上面的代码是left outer join的实现逻辑同样也是用的回溯算法它与inner join有2个不同之处 left outer join的数据源匹配逻辑是当第一个数据源与第二个数据源没有匹配的时候会继续与第三个数据源进行匹配操作原因是数据源的顺序导致了不匹配继续往下匹配就可以避免这个问题。行与行做相等操作的时候右边没有匹配行的时候左边的行继续保留这个是left outer join的逻辑决定的。4. 自定义计算指标 使用自定义计算的原因主要是基于下面的两个方面 数据源引擎不支持数据的混合运算或有特殊逻辑的数据处理。结果数据跨数据源。对此我们对大圣魔方做了如下操作 通过Java里面的ScriptEngine进行封装来实现数据列的混合运算不需要自己再去写编译程序解析。对于特殊的数据处理例如同环比这样的特殊指标需要单独定义接口让实现类继承改特定接口实现类是一个特殊的指标它需要进行多次数据查询将最终的结果通过ScriptEngine进行运算。第二个问题是在上文中“跨数据源数据聚合”的基础上实现的数据聚合后通过ScriptEngine做最后的处理。5. 数据权限的问题 只要是有数据展示数据权限问题就无法避免权限主要是分为报表的可查看权限和维度、指标权限。权限遇到的最主要的问题是构成权限矩阵的数据量太大参与者有用户和组织权限的实体有维度和指标这样大的数据维护起来的成本很高其次是权限数据配置会占用很多的人力。 对此我们做了如下操作 使用UPM控制报表的可查看权限。公司推荐使用UPM来控制权限不过UPM也具有一定的局限性即只能够判断用户或者组织是否满足某个权限而不能满足获取部分权限数据的需求例如某个用户对某个权限只拥有一部分权限那他就无法提供具体数据。但是UPM可以提供是否的权限所以报表的可查看权限可以使用UPM来控制这样可以节约大量的工作。使用默认任何人都有权限的机制。通过使用默认有权限的这个机制可以大大减少权限数据。需要鉴权的那些维度和指标采用默认无权限的机制这样两种方案结合可以最大限度地减少权限数据。通过走审批流机制自助申请。通过审批流机制可以让用户走自助申请大大节约权限数据的维护人力成本。6. 标准化UI组件自助生成可视化报表 报表上展示数据需要有各种各样的图表没法为用户只做一个统一的报表这个时候需要用户能够创建自己想要的报表这时需要提供一个标准的组件库、布局库和一些常用的模板。用户选择好想要的模板然后选择布局对报表页面进行布局接着在每个布局里面填充不同的组件这样就可以构建一张报表了也就是我们常说的所见即所得的方式。 大圣魔方就是采用上述的机制提供了一套可视化报表编辑工具。使用它可以快速地创建一个报表管理人员只需要维护对应的组件、布局和模板就行了。 上述几点就是大圣魔方的一个总纲其中大部分功能已经实现了还有一小部分处于开发之中标准化UI组件、自助生成可视化报表。目前大圣魔方已经上线将近一年了支持了内部众多业务后续我们还会在UI易用性、星型模型、配置简化、元数据同步等方面做一些提高。 最后插播一个招聘广告有对BI工具开发感兴趣的可以发邮件给 fuyishanmeituan.com
http://www.huolong8.cn/news/159241/

相关文章:

  • c 做网站怎么连接到别的网页百度推广营销
  • 推荐郑州网站建设公司公司网站变更域名
  • 360免费建站方法网站建设的基本步奏
  • 网站直接访问网站建设可视化
  • 克拉玛依建设局官方网站广州大石附近做网站的公司哪家好
  • 山东青岛网站建设建设网站找什么
  • 青岛网站设计公司wordpress 用户私信功能
  • 做网站必须要有的素材自己开发手机app软件的步骤
  • 网站备案号在哪儿查询王野摩托车官方网站
  • 深圳网站设计我选刻推荐广东中山网站建设
  • 中山市开发区建设局网站优化seo是什么意思
  • 公司网站开发需求文档湖北省发布最新通告
  • 内蒙古银税贷互动平台seo网站推广软件排名
  • 镇江市住房与城乡建设局网站Divi WordPress企业建站主题
  • 知识付费网站建设wordpress dz
  • 可画在线设计网站建设网站的虚拟机配置
  • 医疗网站前置审批查询企业网站源码库
  • 泰安营销型手机网站建设哪个网站可以做任务
  • 建设企业网站优势插件 wordpress开发
  • 网站设计由哪个部门做wordpress去掉工具栏
  • 个人建个网站多少钱上海家装公司十大排名
  • 太原正规的做定制网站制作网站搜索引擎优化
  • 站长之家网址ip查询青海互动网站建设
  • 一流的龙岗网站建设珠海网站建设公司哪家好
  • 国外乡村建设网站中企做的网站太原
  • 广州建网站兴田德润很好wordpress 文章 模板下载
  • 淘宝接单做网站wordpress 获取当前文章的浏览量
  • 手机网站网站开发流程网站备案个人使用
  • 北京网站开发培训兼容模式网站错位
  • 网站定制开发什么意思广告策划方案万能模板