OLAP多维语义模型

news2024/9/29 17:32:21

概述

为了严谨起见,在正式内容之前,先把OLAP多维语义模型是什么说明一下。

先说OLAP(Online Analytical Processing),它是和OLTP相对的概念,关于这两个概念的详细解释网上有很多。严格的来说OLAP与多维数据没有必然的联系,基于关系模型、图模型、时序模型或者其他数据模型的在线分析都可以叫做OLAP,只不过是因为大多数OLAP系统都采用了多维建模的思路,所以OLAP与多维数据结构就联系到了一起。

再说一下语义模型,以MySQL和Hive为例,二者的底层数据结构分别是B+Tree和HDFS,但是它们提供的SQL并没有与B+Tree和HDFS相关的概念,而是基于表和字段的这种关系型结构,所以可以认为MySQL和Hive在语义层提供了关系型的数据模型。

我们这里所说的OLAP多维语义模型指的是,一个OLAP系统无论其底层的存储结构如何(星型结构、雪花结构、宽表、稀疏维与密集维,亦或是其他结构),如果它具有在逻辑层面精确描述纯粹的多维模型的能力(通过SQL、MDX、编程接口,亦或是其他方式),则可以认为这个OLAP系统能够支持多维语义模型。

后续在介绍各种概念的同时会有实操环节,我们将使用Docker运行一个OLAP多维数据库,所以你要准备一个Docker环境。

现在开始正式内容。与OLAP多维语义模型相关的全部概念都列在了下表中,你现在只需要大概看一下即可,如果完全不懂也没关系,后续会有每个概念的详细说明。

概念说明
维度Dimension维度就是业务角度,通常用于对数据进行分类和分组,以便更好地进行分析。
成员Member成员是维度中的具体元素,表示该维度下的一个特定数据点。
多维数据集Cube多维数据集通过关联多个维度形成逻辑上的N维立方体结构,它提供对业务数据进行多维度分析的能力。
度量Measure度量是在多维数据集中被分析的量化数值,代表业务过程中的关键指标,如销售额、利润等。
集合Set集合由若干个元组组成,集合通常被用于定义多维查询结果中维度的具体展现信息。
元组Tuple元组由若干个维度成员组成,一个元组是多维数据集中的一个数据点,表示一个数据组合。
级别Level级别是层次结构中的一个特定层,代表成员的不同粒度或详细程度,如时间维度中的年、季度、月等级别。
层次结构Hierarchy维度内部的成员之间具有父子级关系,层次结构就是根据成员之间的父子关系形成的一个树状结构。
维度角色Dimension Role当一个维度被某个Cube关联多次时,这个维度会在这个Cube上扮演不同的角色。

准备OLAP环境

你需要准备一台安装了Docker引擎的服务器,然后执行下面的命令,这个命令会启动一个运行了OLAP多维数据库服务的Docker容器。

$ docker run -d -p 8760:8760 --name euclidolap euclidolap/euclidolap:v0.1.8

我们将通过Python交互式编程方式来操作这个OLAP数据库,通过你本地的Python环境来连接容器内的OLAP数据库。

通过本地Python连接OLAP数据库

执行下面的命令,使用pip安装EuclidOLAP的Python包以及requests包。

$ pip install pyolap && pip install requests

进入本地Python交互式环境,然后将下面的代码拷贝进去执行,如果没有报错则表示一切正常。

# 导入pyolap包的euclidolap模块
from pyolap import euclidolap

# 连接至euclidolap多维数据库服务
# IP地址要修改为你的运行docker容器的服务器IP !!!
# IP地址要修改为你的运行docker容器的服务器IP !!!
# IP地址要修改为你的运行docker容器的服务器IP !!!
olap_ctx = euclidolap. OlapContext( "192.168.66.8", 8760)

# 关闭连接
olap_ctx. close()

维度(Dimension)

维度是OLAP多维模型中最为重要的概念之一,它表示某种特定的业务角度,例如对一个电商平台的营业数据进行分析,可能会通过日期、地区、商品、支付方式等业务角度。

在建设数据仓库系统时,通常会采用星型表结构形式,你可以认为OLAP多维语义模型的维度对象就是一个星型结构中的维度表。

我们会从头建立一个多维数据集模型,然后在此模型上进行数据分析,这个Cube是一个电商平台的营业数据模型,它将会关联日期、地区、商品、支付方式四个维度,运行下面的Python代码创建这四个维度对象。

from pyolap import euclidolap

# 如果使用容器内Python环境,IP地址填写 127.0.0.1 !!!
# 如果使用本地Python,IP地址要修改为你的运行docker容器的服务器IP !!!
olap_ctx = euclidolap. OlapContext( "192.168.66.8", 8760)

# create_dimensions方法将返回一个list,其内部元素为Dimension类的实例
dimensions = olap_ctx. create_dimensions( "日期", "地区", "商品", "支付方式")

for dimension in dimensions:
    print( f"{ type( dimension)} - [{ dimension. name} ]维度已被创建")

olap_ctx. close()

成员(Member)

既然维度可以被看做是维度表,那么成员就可以被看做是维度表中的记录。

上一步中已经创建了四个维度对象,相当于建立了四张维度表,但还是空表,接下来我们建立这四个维度所对应的成员,相当于在维度表中插入记录。

from pyolap import euclidolap

date_members_info = [
   [ "2023", "Q1", "M1"],
   [ "2023", "Q1", "M2"],
   [ "2023", "Q1", "M3"],
   [ "2023", "Q2", "M4"],
   [ "2023", "Q2", "M5"],
   [ "2023", "Q2", "M6"],
   [ "2023", "Q3", "M7"],
   [ "2023", "Q3", "M8"],
   [ "2023", "Q3", "M9"],
   [ "2023", "Q4", "M10"],
   [ "2023", "Q4", "M11"],
   [ "2023", "Q4", "M12"]
]

region_members_info = [ "北京", "天津", "上海", "重庆", "广州", "深圳", "杭州", "苏州"]

goods_members_info = [
   [ "游戏机", "PS"],
   [ "游戏机", "XBOX"],
   [ "游戏机", "Switch"],
   [ "体育用品", "山地自行车"],
   [ "体育用品", "皮划艇"],
   [ "体育用品", "足球"]
]

pay_members_info = [ "信用卡", "微信", "支付宝"]

# 如果使用容器内Python环境,IP地址填写 127.0.0.1 !!!
# 如果使用本地Python,IP地址要修改为你的运行docker容器的服务器IP !!!
olap_ctx = euclidolap. OlapContext( "192.168.66.8", 8760)

date_dimension = olap_ctx. get_dimension_by_name( "日期")
date_dimension. create_members( date_members_info)

region_dimension = olap_ctx. get_dimension_by_name( "地区")
region_dimension. create_members( region_members_info)

goods_dimension = olap_ctx. get_dimension_by_name( "商品")
goods_dimension. create_members( goods_members_info)

pay_dimension = olap_ctx. get_dimension_by_name( "支付方式")
pay_dimension. create_members( pay_members_info)

olap_ctx. close()

维度下的成员会依据其之间的父子级关系形成一个树状结构,以商品维度为例,它呈现以下结构。

如图所示,商品维度成员形成树形结构以一个ROOT维度成员为根,这个ROOT是在创建商品维度对象后系统自动创建的,我们所创建的商品维度成员都挂在这个ROOT下面。

多维数据集(Cube)与度量(Measure)

在前两个步骤中我们已经创建了维度,并且为每个维度添加了维度成员,这两部操作等同于创建了维度表并为维度表添加数据。

接下来要创建一个Cube对象,这相当于创建事实数据表。

from pyolap import euclidolap

# 如果使用容器内Python环境,IP地址填写 127.0.0.1 !!!
# 如果使用本地Python,IP地址要修改为你的运行docker容器的服务器IP !!!
olap_ctx = euclidolap. OlapContext( "192.168.66.8", 8760)

date_dimension = olap_ctx. get_dimension_by_name( "日期")
region_dimension = olap_ctx. get_dimension_by_name( "地区")
goods_dimension = olap_ctx. get_dimension_by_name( "商品")
pay_dimension = olap_ctx. get_dimension_by_name( "支付方式")

cube = olap_ctx. build_cube( "电商销售模型",
                          [ date_dimension, region_dimension, goods_dimension, pay_dimension],
                          [ "销售额", "销售数量"])

olap_ctx. close()

在调用olap_ctx的build_cube方法时传入了三个参数,第一个是多维数据集的名称,第二个是此Cube所关联的维度的列表,第三个参数列表指定了这个Cube具有两个度量:销售额和销售数量,这相当于创建的事实数据表具有两个类型为double的度量字段。

到目前为止,我们创建了维度(Dimension)和维度成员(Member),然后构建了多维数据集(Cube)并且指定了度量(Measure),这一波操作就等同于创建了ROLAP星型模型的维度表和事实表,只不过事实表还是空的,当我们向事实表中插入一些数据后就可以进行多维分析了。

执行下面的Python代码,为Cube添加一些度量数据,这相当于在ROLAP事实表中插入了一些数据。

import requests
from pyolap import euclidolap

url = "https://sysbase.oss-cn-beijing.aliyuncs.com/电商销售模型度量数据.txt"
response = requests. get( url)
response. encoding = "UTF8"

# 如果使用容器内Python环境,IP地址填写 127.0.0.1 !!!
# 如果使用本地Python,IP地址要修改为你的运行docker容器的服务器IP !!!
olap_ctx = euclidolap. OlapContext( "192.168.66.8", 8760)

olap_ctx. execute( response. text)

olap_ctx. close()

至此为止,我们已经创建完成了一个完整的多维数据集模型,回顾一下我们都做了什么。

  • 首先,创建了维度,这相当于创建了ROLAP星型模型的维度表;

  • 第二步创建了维度成员,这相当于在维度表中添加了记录;

  • 第三步构建了Cube并指定了度量,这相当于创建了事实数据表;

  • 第四步为Cube添加了度量数据,这相当于在事实表中插入了度量记录。

构建模型的工作已经完毕,在介绍其他概念之前,先基于这个Cube执行几个典型的多维查询。

多维数据分析

首先查询一下2023年每个季度的销售额和销售数量数据,执行下面的python代码:

from pyolap import euclidolap
from pyolap. euclidolap import OLAPQueryBuilder

# 如果使用容器内Python环境,IP地址填写 127.0.0.1 !!!
# 如果使用本地Python,IP地址要修改为你的运行docker容器的服务器IP !!!
olap_ctx = euclidolap. OlapContext( "192.168.66.8", 8760)

query_builder = OLAPQueryBuilder()\
   . from_cube( "电商销售模型")\
   . set_rows( "[Measures].members()")\
   . set_columns( "[日期].[2023].children()")

result = olap_ctx. query( query_builder)

print( result)

olap_ctx. close()

由于没有在地区、商品和支付方式三个维度上进行限定,所以返回的数据在这个三个维度上自动聚合。

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

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

相关文章

Java Email API有哪些常用功能?如何使用?

Java Email API支持哪些邮件协议?常用的邮件API推荐? Java Email API作为Java开发领域中处理电子邮件的重要工具,为我们提供了丰富的功能来发送、接收和管理电子邮件。下面,AokSend就来详细探讨一下Java Email API的常用功能。 …

Webpack-

定义 静态模块:指的是编写代码过程中的html,css,js,图片等固定内容的文件 打包:把静态模块内容压缩、整合、翻译等(前端工程化) 1)把less/sass转成css代码 2)把ES6降级…

Gitlab: Python项目CI/CD实践

目录 1. 说明 2. 准备工作 2.1 服务器 2.2 开发机hosts文件 2.3 项目 3. 步骤过程 3.1 建仓Fastapi T1 3.2 开发机测试构建与推送 ​编辑 3.3 在工作站添加gitlab-runner 3.4 提交代码,查看Pipelines结果 3.5 观察部署情况 4. 参考 1. 说明 分别以一个…

Isaac Sim 1(学习笔记2024.4.22)

仅作为个人学习笔记使用,防止一转头就找不到了 一.ROS bridge 1.On Playback Tick 节点: 在模拟“播放”时生成一个时钟信号。接收到该节点发出的时钟信号的节点将在每个模拟步骤中执行它们的计算函数。 2.ROS Subscribe Twist 节点: 订阅 …

数据结构-循环队列和循环双端队列的多角度实现

文章目录 1. 循环队列的数组形式实现2. 循环队列的链表实现3. 循环双端队列的数组形式实现4. 循环双端队列的链表实现 在力扣的题面如下 1. 循环队列的数组形式实现 其实循环队列的数组形式只有下面要注意的点,只要掌握了下面的这几点,代码层面上就没有什么问题了 用数组模拟的…

精灵传信系统/支持对接易支付/网站+小程序双端php源码下载

简介 精灵传信支持在线提交发送短信,查看回复短信,在线购买额度,自定义对接易支付,设置违禁词,支持网站小程序双端。(文末下载) 演示截图 在数字化浪潮的推动下,技术创新正以前所未…

VUE 弹框内容懒加载-真实项目

背景&#xff1a;VUE 页面&#xff0c;点击按钮&#xff0c;弹框&#xff0c;内容从接口获取&#xff0c;数据量比较大&#xff0c;鼠标滑到页面最底部&#xff0c;调取一次接口&#xff0c;分批加载&#xff1b; demo&#xff1a; <template><div><!-- 触发弹…

通用变频器ACS800-04M-0320-3可议价

商业别名&#xff1a;ACS800-04M-0320-3 产品编号&#xff1a;68279429 ABB 型号名称&#xff1a;ACS800-04M-0320-3 目录说明&#xff1a;ACS800-04M-0320-3&#xff1b; ACS800-04M-0320-3 Pcont.max:250kW, Icont.max:521A 原产地&#xff1a;芬兰 (FI) 海关税则号&#xf…

现代图形API综合比较:Vulkan | DirectX | Metal | WebGPU

Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元&#xff0c;可以处理大量数据&#xff0c;例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…

springboot3 集成knife4j No endpoint GET /doc.html.

springboot3 集成knife4j 访问页面&#xff1a;http://127.0.0.1:8022/doc.html 提示&#xff1a; No endpoint GET /doc.html. 描述环境&#xff1a; java17 springboot3.2.0 knife4j的jar包 <dependency><groupId>com.github.xiaoymin</groupId><a…

vue实现周日历 日历按周切换 vue日程管理

实现的功能 1、点击今天&#xff1a;回到今日日期并选中今日日期&#xff0c;查当天数据 2、点击左箭头&#xff1a;切换上一周 3、点击右箭头&#xff1a;切换下一周 4、黄圆圈代表有日程提醒&#xff0c;点击选中&#xff0c;下方对应显示当前日程提醒的内容&#xff0c;没有…

打造稳定安全的亚马逊测评环境:关键步骤与要点一览

亚马逊测评环境的搭建是一项既复杂又需要深入细致考虑的工作&#xff0c;它涉及多方面的技术配置和资源准备。以下是一些关键步骤和要点&#xff0c;帮助您更高效地构建测评环境。 一、资源筹备 1. 养号系统&#xff1a;选择稳定、高效的养号系统&#xff0c;确保能够模拟真实…

上传文件到HDFS

1.创建文件夹 hdfs -dfs -mkdir -p /opt/mydoc 2.查看创建的文件夹 hdfs -dfs -ls /opt 注意改文件夹是创建在hdfs中的&#xff0c;不是本地&#xff0c;查看本地/opt&#xff0c;并没有该文件夹。 3.上传文件 hdfs dfs -put -f file:///usr/local/testspark.txt hdfs://m…

【JavaEE初阶系列】——网络原理之进一步了解应用层以及传输层的UDP协议

目录 &#x1f6a9;进一步讲应用层 &#x1f388;自定义应用层协议 &#x1f388;用什么格式组织 &#x1f469;&#x1f3fb;‍&#x1f4bb;xml(远古的数据组织格式) &#x1f469;&#x1f3fb;‍&#x1f4bb;json(当下最流行得一种数据组织格式) &#x1f469;&…

Docker(二)Docker+ server部署极简前端页面

本篇文章介绍如何使用 Dockerserver 将一个极简前端页面进行部署 1.本地运行一个简单的前端页面&#xff0c;再把它部署到服务器上 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

算法思想总结:栈

一、栈的经典应用&#xff1a;波兰表达式与逆波兰表达式 我们平时看到的 12*&#xff08;3-4*5&#xff09;6/7 叫做中缀表达式&#xff0c;平时我们习惯用这个计算的原因是我们可以整体地去看到这个表达式并且清楚地知道各个运算符的优先级&#xff0c;但是计算机并不一定知道…

JavaScript之模块化规范详解

文章的更新路线&#xff1a;JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题&#xff08;HTML基础知识和CSS基础知识已经更新完毕&#xff09; 正文 CommonJS、UMD、CMD和ES6是不同的模块…

详解爬虫基本知识及入门案列(爬取豆瓣电影《热辣滚烫》的短评 详细讲解代码实现)

目录 前言什么是爬虫&#xff1f; 爬虫与反爬虫基础知识 一、网页基础知识 二、网络传输协议 HTTP&#xff08;HyperText Transfer Protocol&#xff09;和HTTPS&#xff08;HTTP Secure&#xff09;请求过程的原理&#xff1f; 三、Session和Cookies Session Cookies Session与…

核桃派全志H616实现VNC远程桌面教程

VNC远程桌面 核桃派预装了VNC服务器&#xff0c;VNC适应于局域网&#xff08;通常指同一个路由器网络下&#xff09;桌面登录。使用该服务前先确保核桃派已经通过以太网或无线WiFi连接到路由器。 使用核桃派桌面系统的时候由于要配置各类信息和联网&#xff0c;可以使用HDMI显…

【C语言】每日一题,快速提升(5)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. strlen函数 2. strcpy函数 3. strcat函数 题目&#xff1a;模拟实现 strlen--strcpy--strcat--三个函数 1. strlen函数 字符串计算 #include <stdio.h…