OLAP多維語義模型(一)
概述
為了嚴謹起見,在正式內容之前,先把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 = "電商銷售模型度量資料.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()
由於沒有在地區、商品和支付方式三個維度上進行限定,所以返回的資料在這個三個維度上自動聚合。
從建立多維模型,然後新增度量資料,再進行多維查詢的一個簡單流程已經完成了,我會在後續文章中繼續介紹其他的多維語義模型概念。
關注這個號,你可以瞭解更多關於OLAP和多維資料的相關資訊。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/31559044/viewspace-3002345/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 三維點雲語義分割模型介紹模型
- 開源BI報表及OLAP多維分析平臺OPENI(一)—DEMO演示
- 隱語義模型模型
- 【機器學習】--隱語義模型機器學習模型
- 多維灰色預測模型的一點改進模型
- BI、OLAP、多維分析、CUBE 這幾個詞是什麼關係?
- 多維灰色預測模型心得模型
- 一維多維陣列陣列
- scala語法 -多維陣列陣列
- 探究大語言模型的思維方式模型
- 大語言模型是一個多專家代理系統?模型
- php 一維陣列變多維PHP陣列
- 多維陣列轉一維陣列(降維的多種方式)陣列
- 大資料實時多維OLAP分析資料庫Apache Druid入門分享-上大資料資料庫ApacheUI
- 大資料實時多維OLAP分析資料庫Apache Druid入門分享-下大資料資料庫ApacheUI
- 多視角三維模型紋理對映 01模型
- 模型關聯一對多模型
- PHP多個多維陣列操作(一)PHP陣列
- CosyVoice多語言、音色和情感控制模型,one-shot零樣本語音克隆模型本地部署(Win/Mac),通義實驗室開源模型Mac
- LLM大語言模型-ChatGPT、LLaMA、ChatGLM、文心一言、通義千問模型ChatGPT
- 集眾之長,一種包含多種語言模型的混合框架模型框架
- 深入探索C++物件模型-(四)data語義學C++物件模型
- 文字主題模型之潛在語義索引(LSI)模型索引
- 多維資料分析模型設計器Schema Workbench的使用模型
- 語義模型在智慧工業運營中的作用模型
- 大型語言模型將如何重新定義製造業?模型
- 周博磊:深度生成模型中的隱藏語義模型
- Golang試用阿里通義千問大語言模型Golang阿里模型
- 預訓練語言模型:還能走多遠?模型
- 海南話語音識別模型——模型訓練(一)模型
- 將一個多維陣列徹底的降維陣列
- 定義多維的點模板類,任意資料型別資料型別
- AI一刻 | 廣義線性模型AI模型
- 多維陣列拍平一層陣列
- OLAP分析
- 語言≠思維,大模型學不了推理:一篇Nature讓AI社群炸鍋了大模型AI
- 多維分析模型頻繁變動的解決方案有哪些?模型
- 模型思維(01)模型