mysql构建数据立方体_OLAP数据建模工具Workbench的初步使用(数据立方体的建立)

OLAP数据建模工具Workbench的初步使用(数据立方体的建立)

概要:

1.workbench工具简介

2.workbench简单操作(附demo)

3.workbench初步使用总结

1.workbench工具简介

OLAP,(Online Analytical Processing,联机分析处理)。从事相关工作的小伙伴,具体的相关概念就不一一赘述,概念不懂,有古哥和度娘的柔怀。在这里,主要介绍一番在OLAP中,数据建模的工具workbench的使用。我们知道,要想进行OLAP,则需要建立数据立方体,来从多个维度来分析数据,从而得到相应的信息。关于数据立方体(Cube),其实就是一个XML文件,然后由ROLAP(relation-olap)服务器,如mondrian,或者轻量级OLAP分析引擎Saiku进行解析,最后将所需的信息以报表形式呈现。

所以,OLAP数据建模,即数据立方体的建立也就相当关键,直接影响结果的准确性。对于数据立方体,可以采用直接写XML的形式写出来。然而当数据立方体比较大,对应的XML会非常的大,内容也很多。对于维护以及查阅,造成一定的困难。所以这个时候,建议使用OLAP建模工具workbench来创建数据立方体。简单来说,workbench就是一个建立数据立方体的图形界面工具,由Java语言开发。通过workbench的图形界面,建立数据立方体,然后该工具帮你自动生成对应的XML。当然,有些大大说不好用,的确有些地方用着不舒服,但是一个人一种习惯,自己顺手就好啦。一句话:工具为了提升效率,别和自己过不去呀。

2.workbenchbench简单操作

下面我们通过一个简单的demo,来创建一个数据立方体,show一下工具的简单使用。

相关参数:

a. 数据立方体:myCube

b. 所连数据库:test

c. 关联事实表:my_fact_table

d. 关联维度表:my_dim_table

e. 所建维度:myDimension

f. 所建指标:myMeasure和myCM

注:涉及概念,古哥和度娘在等你。

1)连接数据库

a.因为所建的这个数据立方体是关联到一个数据库中的数据,所以我们需要先连接一个库。我所使用的是本地mysql数据库。

如图1.

2530613b0e794def9ca93db49acf31dc.png

b.如图2,弹出如下界面,选择“一般”-->连接类型选择“MySQL”-->连接方式选择“Native(JDBC)”-->填写右侧设置中的信息。

a765c50a5552c8be5a229b97732d6c45.png

c.如图3,点击测试,测试是否可以连接成功。若OK,点击确认,连接完成。

9491ba691b9ee0501e7c9c968f7ee1af.png

2)建立Schema

何谓Schema?简单来说,就是描述一个逻辑模型到数据库中物理模型的映射的。其实他就是数据库中的一个命名空间,里面包含着诸如表、索引等对象。

a.如图4.File-->new-->Schema

121b3e1cf3dc856da7e2e4797305ad2b.png

b.如图5,填写Schema相关信息。

·name:指该Schema名称,我们命名为mySchema。

·description:该Schema相关的描述,可以为空

1b1468385a5bb4a24f67caa0311c0570.png

3)建立Cube

a.如图6

fb3767d7b1503ff29e65dd8ffb6c43bb.png

b.如图7,填写Cube相关信息

·name:指该Cube名称,我们命名为myCube

·description:该Cube的描述,可以为空,对外不可见

·caption:对外显示的标题

19d77c833f55735f1de0030f3fe007b7.png

4)Cube关联事实表

a.如图8

18d19d19e28058fbd335d4477ed05738.png

b.如图9,选择相关的事实表,我们选择my_fact_table。

b6a0f813080b847d1c67dc59179e0257.png

5)建立维度myDimension

a.如图10

4ad6cdd1c1c9fcd2f2c8dad41ee5ab3e.png

b.如图11,填写Dimension相关信息

·name:指该维度的名字,我们命名为myDimension

·description:该维度的描述,对外不可见,可以为空

·foreignKey:这是指维度表在事实表中的外键。如事实表my_fact_table与维度表my_dim_table通过字段user_id相关联,即my_fact_table事实表中,user_id的字段内容是维度表my_dim_table中的主键。则user_id则是外键,所以将user_id填入此处,用来关联两个表。记住,此处填写的是事实表中的字段,不是维度表中的。

·caption:对外显示的标题

0adab80e10ac66e81b3a937c273e6af9.png

c.如图12,填写维度下层次的信息

·primaryKey:指的是维度表中的主键,此处需要关联完维度表后选择。

3a3cdf94beef5c52b402fcdf90066908.png

d.如图13,14,为该维度关联维度表

11541616203bf0f1274b34f69d3a73d9.png

4fa063afac14200a5a4959cb671e9b1c.png

e.如图15,16,建立维度的层级,并填写相关信息

·name:层级的名词,我们命名为myLevel

·table:此处填写要关联的维度表,但因为之前已经关联,所以此处为空,不需要填写。

·column:此处是和事实表关联的字段

·nameColumn:此处是维度表中,将要显示的字段,若为空,则默认显示column处的字段内容,一般不填写,而是把该内容写到column中。

·type:要显示列的数据类型,如nameColumn为空,则填column处字段的类型

·levelType:除了时间,其他类型都选择Regular

·hideMemberIf:一般都选择Never,即不管什么情况下,数据都不隐藏

·caption:对外显示的名字

·visible:勾选,对外可见

9278cafb591788a5d6e471bf38ae4928.png

8688dd78d5bbc1f6e73e13c8c0e9a508.png

f.别忘记了第c步中选择主键哦

6)建立指标

6-1)建立正常指标

a.如图17

9173f423515e45d427376ee901dc7a4b.png

b.如图18,填写相关信息

·name:指标名称,我们命名为myMeasure

·aggregator:我们采用的聚合函数,可以通过下拉选择,这里我们采用distinct-count,来计算一共有多少个user_id

·column:要应用函数的列,这里我们在下拉中选择user_id

·formatString:结果显示的形式,这里我们没有选,可以选择###.###,以三位一组来显示。

·datatype:要显示的结果是什么类型的,我们选择Numeric,也可以选择Integer,因为我们是计算user_id的数量

·caption:对外显示的标题

·visible:勾选,对外可见

b40aac49edd5e3049d07e3b0bbc4589c.png

6-2)建立带sql表达式的指标

如果我们要应用函数的列不是一整列,而是该列中符合我们筛选条件的一部分,该怎么办呢?简单,通过添加表达式来书写筛选sql来得到我们要应用函数的那一列的部分。

a.如图19

5302b902514a3d4a864a0a00d034be39.png

b.如图20,我们要书写筛选条件sql,采用sql的条件语句:

case when my_fact_table.id < 10 then my_fact_table.user_id else null end

意思是:如果事实表中的主键id小于10,那么我们将主键小于10的user_id来应用distinct-count函数,否则,该列为空。

79e8c8fd2d482c95e544ad415bc159f6.png

小技巧:这里书写完sql,如果你直接点击左侧的菜单栏,当你再次打开这个sql时,就发现,哎?怎么是空白的?我之前写的sql呢?报警了啊!居然没了!对,你没有看错,就是没了。我也不知道为啥会这样,估计是这工具的一个小bug,但是这种问题如何解决呢?简单!只要点击当前页面的任意一个选项就可以啦,你看下面不是有个dialect吗?鼠标双击它,然后再点击菜单栏,问题就没了,sql就保存了。我也是费了好大劲才发现,囧。

7)建立CM

CM是啥咧?Calculated Member,计算成员。但这又是啥?简单来说,CM也是一种指标,只是不像6)中的指标,只有他提供的那几个函数,在CM中,我们可以通过MDX多维表达式来自己定义一些自己想要的函数或者表达式,来完成我们对列的复杂操作。

如图21

f54e772c8b59c692ce8f751f3d3e3170.png

如图22,填写相关CM信息

·dimension:这里只选择Measures,因为我们要借助指标来进行函数计算

·formula|formulaElement:这是我们自定义函数的表达式,这里需要用MDX语言,该语言是适用于OLAP的多维表达式,类似于sql,但有区别。我们在这里写[Measures].[myMeasure] / 24,意为:我们用我们之前建立的指标myMeasure来除以24,假设我们之前的指标myMeasure表示一天的用户数量,则这个CM所计算的结果代表平均每个小时的用户量。

57b19fa4836c98c534bc9344251e172e.png

8)保存

点击工具栏中的保存按钮,将我们的Schema保存下来,以供后续使用,到此,数据模型我们已经建立完成,得到了相应的xml,如图24。

1bc112b3da9235450632d74de1c1f836.png

3.workbench初步使用总结

1.workbench的功能不仅这一点,还有很多,这里只是初步给大家展示一下如何建立一个简单的数据立方体。当然,深入学习还是靠自己,关于该工具,有提供的相关文档mondrian_technical_guide.pdf,在软件安装包doc文件夹中,虽然是英文的,我想这不是问题哈。

2.很多人疑惑,建立完xml就完了?那么数据怎么展示?哈哈,当然没有结束,不过那不是我们这篇文章所讨论的啦,以后会给大家补上如何应用saiku引擎或者mondrian这种olap服务器来解析xml并展示出我们所需要的报表数据的。

3.再次声明,这文章本身就是我这个小菜鸟写的一篇给另一些不熟悉的小菜鸟看的。请各路大神大牛勿喷哦,我也是刚开始接触olap,现在学识浅薄,只当做个积累,也拿出来和大家分享分享,若有哪里不对的地方,请多多指点,不胜感激。

4.最后,大家一起努力,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql访问60s出现timeout_websocket 每60s报WsHttpUpgradeHandler.timeoutAsync

在后台连接了一个websocket连接&#xff0c;每60s就报如下错误&#xff0c;有知道这是什么情况的吗&#xff1f;2020-09-10 14:22:40 [Catalina-utility-1] ERROR org.apache.coyote.http11.Http11NioProtocol -Error processing async timeoutsjava.util.concurrent.Execution…

java 类 方法继承_java – 在方法重写中返回继承的类而不是超类

我有一个看起来像这样的类结构&#xff1a;class Parent {public Parent(int property) { /* use property */}}class Son extends Parent {public Son(int parentProperty, String sonProperty) {super(parentProperty);/* use son property */}}我想为这两个类创建构建器,以便…

python环绕文字_如何用css实现文字三面环绕图片?

html部分&#xff1a;DIV with content or Image in the Middle of the text Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam rhoncus nibh ipsum, nec tincidunt mauris suscipit non. Nullam euismod est in dui vehicula ornare quis non nulla. Sed ul…

java写入数组_如何在Java中将数组写入outputStream

我想通过Socket发送多个随机值.我认为数组是发送它们的最佳方式.但是我不知道如何将数组写入Socket outputStream&#xff1f;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.Socket;import java.io.*;import j…

java循环1000000000_求十亿内所有质数的和,怎么做最快?

注&#xff1a;对知乎的公式编辑功能实在无力吐槽&#xff0c;用typora写的文章直接粘过来公式无法显示&#xff0c;只好又手工加上了全部公式&#xff0c;不过可能还是会有遗漏。大家可以点击这个链接 查看我的博客原文。以下是正文&#xff1a;第一次关注到这个问题是在做pro…

java推送Comet_使用Comet4j实现消息推送

public class NewMsgCollector extends ConnectListener implements ServletContextListener {private static final String CHANNEL "hello";public void contextInitialized(ServletContextEvent contextEvent) {//注册应用的channelCometContext context CometC…

java飞行记录器是什么_运行java飞行记录器JFR(java flight recorder)

JFR上面讲到的工具都是作为快速的查看诊断工具的。如果要深入分析问题&#xff0c;可以选择使用内置的Java飞行记录器:Java Mission Control。转储JFR需要三步&#xff1a;1. 创建一个包含了你自己配置的JFR模板文件。运行jmc, 然后Window->Flight Recording Template Manag…

java申请安卓权限_java4android (包和访问权限)

什么是Java当中的软件包&#xff1f;为什么要使用软件包&#xff1f;如何给一个类打包&#xff1f;//将类放置到一个包中&#xff0c;需要使用package“包名”//打包 编译的方法 javac -d . Test.java//出现错误&#xff1a;编码GBK的不可映射字符 javac -encoding UTF-8 -d . …

java圆形泳池问题_Java实现 LeetCode 778 水位上升的泳池中游泳(二分+DFS)

778. 水位上升的泳池中游泳在一个 N x N 的坐标方格 grid 中&#xff0c;每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度。现在开始下雨了。当时间为 t 时&#xff0c;此时雨水导致水池中任意位置的水位为 t 。你可以从一个平台游向四周相邻的任意一个平台&#xff0c…

python可以构建sem模型_python-分组的熊猫DataFrames:如何将scipy.stats.sem应用于它们?...

我知道我可以通过执行以下操作来应用numpy方法&#xff1a;dataList是DataFrames的列表(相同的列/行).testDF (concat(dataList, axis1, keysrange(len(dataList))).swaplevel(0, 1, axis1).sortlevel(axis1).groupby(level0, axis1))testDF.aggregate(numpy.mean)testDF.aggr…

java类中获取全局变量_java 通过反射获取类的全局变量、方法、构造方法

package com.str;public class ZiFuChuan {public static String ss "全局变量!!!!!!";String s2 null;public int aa 1 ;int aa2;double dou 1.1;Double d new Double(1.1);public static void main(String[] args) {}public ZiFuChuan(){}public ZiFuChuan(St…

java phantomjs 截图_phantomjs 截图

phantomjs 截图&#xff0c;多个setTimeout是为了让页面尽量加载完整/**截图test.js**/var page require(webpage).create();page.viewportSize { width: 1024, height: 600 };page.open(http://www.2345.com/, function(status) {var bb page.evaluate(function(){// window…

JAVA如何隐藏异常堆栈_java – 如何在控制台上停止打印异常堆栈跟踪?

这是我做的这样的战争作为工作。添加一个过滤器并劫持所有的请求和响应。检查异常并检查类型。/*** Hijacks all the http request and response here.* Catch the SocketException and do not print* If other exceptions print to console* date : 9-18-2013** author Suresh…

阿里最新php面试题及答案,面经网-阿里php面试题(四)

阿里php面试题(四)1.表单中 get与post提交方法的区别&#xff1f;答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.2.session与cookie的区别?答:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_…

php 条形码生成器,PHP条形码图像生成器

这是一个用于生成barocdes的简单PHP脚本&#xff1a;//For displaying barcodes//Arguments are:// code Number you want outputted as a barcode//You can use this script in two ways:// From a webpage/PHP script // Directly in your web browser http://www.example.co…

php怎么把日期加时间,将小时分钟添加到日期时间 - php

任何人都可以帮助我解决长时间困扰的问题&#xff0c;我正在尝试添加时间&#xff0c;例如格式为h:ia的小时和分钟&#xff0c;格式为01:00(一个小时)&#xff0c;00:30(30分钟)&#xff0c; 02:00(两个小时)等。在php中。因为我有几个小时&#xff0c;例如(00:30,01:00,01:30,…

php keep user login,php5.4安装dedecms登录后台空白解决办法(session_register函数已废弃)...

本地安装dedecms5.7登录后台空白&#xff0c;找了原因&#xff0c;原来是session_register函数已经被php5.4废弃的原因。-------------------------------------------------------------解决方法&#xff1a;找开include/userlogin.class.php文件&#xff0c;查找以下内容&…

java欧冠抽签,欧冠抽签吐槽:最大的“礼包”被C罗拿走!梅西出局概率超50%?...

欧冠16强抽签揭晓&#xff0c;结果&#xff1a;多特VS巴黎&#xff0c;皇马VS曼城&#xff0c;亚特兰大VS瓦伦西亚&#xff0c;马竞VS利物浦&#xff0c;切尔西VS拜仁&#xff0c;里昂VS尤文图斯&#xff0c;热刺VS莱比锡&#xff0c;那不勒斯VS巴萨。怎么评价这样的抽签呢&…

java ajax报错500,(Struts2+JSON+Ajax) XMLHttpRequest ==500如何解决

(Struts2JSONAjax) XMLHttpRequest 500怎么解决&#xff1f;本帖最后由 zjlisok 于 2013-01-29 02:00:05 编辑XMLHttpRequest.status500奇怪了&#xff0c;搞了半天还没有解决。朋友们请帮我一把&#xff0c;谢谢&#xff01;废话不说&#xff0c;先上代码JS代码&#xff1a;va…

PHP的rm指令,git rm 命令

git rm 命令git rm 命令用于删除文件。如果只是简单地从工作目录中手工删除文件&#xff0c;运行 git status 时就会在 Changes not staged for commit 的提示。git rm 删除文件有以下几种形式&#xff1a;1、将文件从暂存区和工作区中删除&#xff1a;git rm 以下实例从暂存区…