數(shù)倉(cāng)避坑-整明白懂粒度
編輯導(dǎo)語(yǔ):在數(shù)倉(cāng)中,你理解什么是粒度嗎?這是一個(gè)很抽象的名詞,但同時(shí)它又是數(shù)倉(cāng)中重要的一個(gè)概念。作者通過(guò)五個(gè)方面總結(jié)如何把粒度整明白的方法,我們一起來(lái)看下吧。
上篇文章數(shù)倉(cāng)避坑-搞懂維度模型介紹了維度建模經(jīng)典的四部曲:選定業(yè)務(wù)過(guò)程、聲明粒度、確定維度、確定事實(shí)。
第二步中,粒度的概念著實(shí)有點(diǎn)抽象,很難理解。但是,如果粒度整不明白,近乎等于數(shù)倉(cāng)沒(méi)入門(mén),你將會(huì)面臨一系列問(wèn)題~
今天就給大家分享一下,我踩坑粒度的過(guò)程。
一、先說(shuō)說(shuō)粒度的概念
選定了分析的過(guò)程,緊接著就要聲明粒度??吹綍?shū)里這么說(shuō),我當(dāng)時(shí)的反應(yīng)是:為什么?粒度是什么?普通場(chǎng)景里,粒度可以理解為一個(gè)東西的大小。
比如,鉆石要區(qū)分顆粒度,大小不同的鉆石,價(jià)格不一。而在數(shù)據(jù)分析的語(yǔ)境里,粒度則意味著分析的范圍,分析的細(xì)致程度。舉兩個(gè)例子。
系統(tǒng)的注冊(cè)總?cè)藬?shù),可以按照國(guó)家、省份來(lái)統(tǒng)計(jì),這是地域?qū)用嫔系牟煌y(tǒng)計(jì)粒度。系統(tǒng)的活躍用戶數(shù),可以按天、按周統(tǒng)計(jì)登錄人數(shù),這是時(shí)間層面上不同的統(tǒng)計(jì)粒度。
從數(shù)據(jù)表的角度來(lái)看,粒度則解釋著什么情況下增加一條記錄。按國(guó)家統(tǒng)計(jì)用戶數(shù),中國(guó)只會(huì)有一條記錄,按省統(tǒng)計(jì),中國(guó)則會(huì)有34條記錄。
按周統(tǒng)計(jì)活躍用戶,一年只會(huì)有 52 行記錄,按天統(tǒng)計(jì),一年則有 365 或 366 條記錄。
二、通過(guò)實(shí)戰(zhàn)理解粒度
好,看書(shū)搞懂了概念,實(shí)戰(zhàn)就來(lái)了。公司出了新 APP,老板很關(guān)心新 APP 的用戶活躍程度,于是,用戶端產(chǎn)品經(jīng)理希望做個(gè)面板,看每天有多少人登錄。
同時(shí),他提了另一個(gè)需求,他希望能支持統(tǒng)計(jì)兩個(gè)日期區(qū)間內(nèi)的登錄人數(shù)(兩個(gè)日期是變化的)。
通過(guò)例子理解:某個(gè)活動(dòng)發(fā)布后,要查看不同時(shí)間區(qū)間內(nèi)的累積活躍用戶數(shù),比如1-2號(hào),3-5號(hào),以便及時(shí)調(diào)整促活的策略。
初生牛犢不怕虎,說(shuō)搞咱就搞,就按照維度建模經(jīng)典套路搞。
首先,選定業(yè)務(wù)過(guò)程。這個(gè)一目了然,自然就是用戶登錄過(guò)程。
其次,聲明粒度。這里用戶方希望按照不同的日期統(tǒng)計(jì)累積人數(shù),那粒度是天。
然后,是確定維度。這個(gè)例子里,因?yàn)橐凑杖掌诜治觯钪饕木S度是日期(為了簡(jiǎn)單,例子里就就先不考慮其他維度了),日期維度表設(shè)計(jì)如下:
最后,設(shè)計(jì)事實(shí)表。這個(gè)也不難,用戶登錄事實(shí)表(fact_loign)設(shè)計(jì)如下:
三下五除二,維度模型搞定!就等寫(xiě)好 ETL 腳本,按周期調(diào)度啦。
三、維度模型搞不定,是粒度理解不到位
構(gòu)建模型,最終都是為了查出對(duì)應(yīng)的指標(biāo)和結(jié)果,所以維度模型通常都會(huì)跟標(biāo)準(zhǔn)的指標(biāo)系統(tǒng)配套來(lái)使用。對(duì)指標(biāo)體系不太了解的朋友可以看這篇:
一文幫你更好地理解指標(biāo),或者看華為阿里的產(chǎn)品。當(dāng)我們按照標(biāo)準(zhǔn)套路,進(jìn)入指標(biāo)設(shè)計(jì)階段,問(wèn)題就會(huì)慢慢浮出水面了。基于事實(shí)表模型,我們很容易設(shè)計(jì)原子指標(biāo)【登錄人數(shù)】,其計(jì)算邏輯為
count(fact_login.user_id)
進(jìn)而,我們也能設(shè)計(jì)出衍生指標(biāo)【日期_登錄人數(shù)】,其口徑為:
select distinct count(fact_login.user_id) from fact_loginleft join dim_date on date.date_key = fact_login.login_dategroup by dim_date.date_key
從衍生指標(biāo)這里,就能發(fā)現(xiàn)問(wèn)題了。你會(huì)發(fā)現(xiàn),group by 后的結(jié)果,是按照每天進(jìn)行去重的。
最終的結(jié)果,只能是統(tǒng)計(jì)每天范圍內(nèi)的累積登錄人數(shù)。用戶的期望是,統(tǒng)計(jì)某個(gè)時(shí)間區(qū)間內(nèi)的累積登錄人數(shù),這個(gè)需求維度模型產(chǎn)生的指標(biāo)沒(méi)法滿足。如果事實(shí)表的真實(shí)數(shù)據(jù)如下:
基于維度模型,系統(tǒng)可以生成這樣的匯總表:
但系統(tǒng)無(wú)法生成如下匯總表:
需求只能搞定一般,這可怎么交差?
四、粒度是搞清問(wèn)題的關(guān)鍵
剛開(kāi)始,我很疑惑,想了各種辦法也沒(méi)辦法解決。后來(lái)才意識(shí)到,問(wèn)題根源其實(shí)是粒度。
讓我們回歸到真實(shí)場(chǎng)景里:登錄成功,這個(gè)事件發(fā)生在一瞬間。常見(jiàn)的時(shí)間計(jì)量單位有年、月、天、小時(shí)、分鐘、秒、毫秒、微秒等等。而系統(tǒng)記錄某個(gè)操作,常見(jiàn)的記錄粒度是秒。
比如, 2021 年 6 月 27 號(hào) 14 : 00 : 00,小明登錄了系統(tǒng)。如果按照秒去統(tǒng)計(jì)登錄人數(shù),則完全不用考慮去重,因?yàn)樾∶髟谶@個(gè)粒度的計(jì)量單位里,只能登錄一次。但秒級(jí)別的統(tǒng)計(jì)粒度,太細(xì)了。
業(yè)務(wù)方希望從更加宏觀的角度去統(tǒng)計(jì)和分析,例子里面,是以天為單位去統(tǒng)計(jì)。
那這個(gè)時(shí)候,統(tǒng)計(jì)就要升粒度了,并且,要去重。此時(shí),系統(tǒng)也是可以按照天的粒度進(jìn)行去重統(tǒng)計(jì)的。那問(wèn)題又是啥呢?再看看實(shí)際需求時(shí),統(tǒng)計(jì)的時(shí)間區(qū)間是不固定的。
即,業(yè)務(wù)方可能今天想統(tǒng)計(jì) 1 號(hào)到 2 號(hào)的登錄人數(shù),明天想統(tǒng)計(jì) 3 號(hào)到 5 號(hào)的登錄人數(shù)。這個(gè)時(shí)候,就沒(méi)法玩了,為什么呢?
粒度不固定:1-2號(hào),間隔時(shí)間是1天,3-5號(hào),間隔時(shí)間則是2天。維度建模中,聲明粒度就是要把粒度的大小定下來(lái)。
不管是什么維度,都要提前把粒度定下來(lái),這樣才能實(shí)現(xiàn)累計(jì)去重。
從技術(shù)實(shí)現(xiàn)的角度來(lái)看,如果查詢(xún)的粒度,是一個(gè)變量,而不是一個(gè)固定值,沒(méi)法提前計(jì)算,只能臨時(shí)用明細(xì)表算,這就叫做即系查詢(xún)。
所以,這個(gè)需求中,維度建模只能解決前面部分的需求:按照天去重統(tǒng)計(jì)每天登錄人數(shù)。而變化區(qū)間的去重統(tǒng)計(jì),只能即席查詢(xún)了。
五、最后,說(shuō)點(diǎn)學(xué)習(xí)經(jīng)驗(yàn)
維度建模工具箱這本書(shū),一再?gòu)?qiáng)調(diào)粒度的重要性,大概率就是因?yàn)榱6冗@玩意,太抽象,不好理解。
當(dāng)初,我就在這上面理解出了差錯(cuò),陷在維度建模的漩渦里。
本人愚笨,看書(shū)好久,都沒(méi)明白粒度的真正含義,被真實(shí)業(yè)務(wù)需求痛扁一頓后,我才體會(huì)到粒度的真正含義。
作為一個(gè)新人,接觸到新的方法或者工具,我們是興奮的。
與此同時(shí),我們也要謹(jǐn)防 “撿到錘子,看什么都像釘子”,沒(méi)有能解決所有問(wèn)題的方法和工具,特定場(chǎng)景,選用特定的工具。死磕核心概念,結(jié)合實(shí)際場(chǎng)景去理解,搞懂了,很多問(wèn)題就通了~
作者:lee;公眾號(hào):樂(lè)說(shuō)樂(lè)言
本文由 @lee 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載
題圖來(lái)自?Unsplash,基于 CC0 協(xié)議
沒(méi)太理解這個(gè)需求的難度在哪里,sql改改,或者復(fù)雜點(diǎn)直接用spark,都很容易啊
手寫(xiě)SQL自然是可以隨便改呀,我想強(qiáng)調(diào)的是,粒度不同,SQL也不同,那基于指標(biāo)口徑就沒(méi)辦法生成了。
某個(gè)方法給了一個(gè)方的模具,用這個(gè)方法,搞出來(lái)的肉丸子肯定是方的,但需求方希望肉丸子是圓的。我重點(diǎn)想說(shuō)的是,用這個(gè)方模具搞不來(lái)圓的。然后您說(shuō),用手捏可以捏出來(lái)圓的。大概如此吧。
顆粒度還有一個(gè)重要的概念,就是大的顆粒并不是小顆粒的累加。就像2兩一個(gè)的螃蟹賣(mài)10元一只,4兩一個(gè)的螃蟹并不賣(mài)20元一只,有可能是40元。
數(shù)據(jù)分析的場(chǎng)景里面,粒度問(wèn)題多數(shù)都是去重引起的。
不過(guò)您這個(gè)生活化的例子挺好,感謝補(bǔ)充~
2兩的螃蟹和4兩的螃蟹,你這不是顆粒度了,是維度了。
2個(gè)2兩一個(gè)的原價(jià)必然賣(mài)20。