OLAP多維語義模型(一)

菜鳥嗯菜鳥發表於2024-01-02

概述

為了嚴謹起見,在正式內容之前,先把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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章