本章節(jié)主要為您介紹基于表格存儲的海量氣象格點數(shù)據(jù)解決方案的模型及方案設(shè)計。

標準化格點數(shù)據(jù)模型

一個規(guī)整的五維網(wǎng)格數(shù)據(jù)為一個網(wǎng)格的數(shù)據(jù)集(GridDataSet),按照維度順序五維分別為:
維度 說明
variable 變量,例如各種物理量
time 時間維度
z z軸,一般表示空間高度
x x軸,一般表示經(jīng)度或緯度
y y軸,一般表示經(jīng)度或緯度

GridDataSet = F(variable, time, z, x, y)

一個GridDataSet除了包含五維數(shù)據(jù),以及各個維度的長度等外,還包含一些其他信息:
名稱 說明
GridDataSetId 唯一標記這個GridDataSet的ID。
Attributes 自定義屬性信息,例如該數(shù)據(jù)的產(chǎn)生時間、數(shù)據(jù)來源、預報類型等等。

您可以自定義屬性,也可以給某些屬性建立索引,建立索引后就可以通過各種組合條件來查詢符合條件的數(shù)據(jù)集。

例如,假設(shè)某種氣象預報每次預報未來72小時的每個整點的各個高度、各個經(jīng)緯度的各種物理量,則這次預報就是一個標準的五維數(shù)據(jù),是一個單獨的GridDataSet,下一次相同的預報則是另一個數(shù)據(jù)集。這兩個數(shù)據(jù)集需要有不同的GridDataSetId。這兩個數(shù)據(jù)集比較類似,只是起報時間不同,但是因為起報時間不在五維模型中(五維內(nèi)的時間為一次預報中的未來不同時刻),所以屬于不同的數(shù)據(jù)集,起報時間可以作為數(shù)據(jù)集的自定義屬性。本方案中,也支持對自定義屬性設(shè)置條件進行檢索。

數(shù)據(jù)存儲方案

表格存儲設(shè)計了兩張表分別存儲數(shù)據(jù)集的meta和data:
  • meta表示這個數(shù)據(jù)集的元數(shù)據(jù),例如GridDataSetId、各維度長度、自定義屬性等。
  • data表示這個數(shù)據(jù)集里實際的網(wǎng)格數(shù)據(jù)。data相比meta在數(shù)據(jù)大小上要大很多。
將數(shù)據(jù)集的meta和data分開存儲,主要是出于以下考慮:
  • 用戶會有根據(jù)多種條件查詢數(shù)據(jù)集的要求,例如查詢最近有哪些數(shù)據(jù)集已經(jīng)完成入庫,或者查詢表中有哪些某種類型的數(shù)據(jù)集等。傳統(tǒng)方案中主要是通過MySQL等關(guān)系型數(shù)據(jù)庫來存儲,在本方案中我們通過單獨的meta表來存儲,并通過表格存儲的多元索引功能來實現(xiàn)多條件的組合查詢和多種排序方式,相比傳統(tǒng)方案更加易用。
  • 在查詢格點數(shù)據(jù)之前,一般要知道格點數(shù)據(jù)中各維度的長度等信息,這些信息就是存儲在meta表中的,即需要先查詢meta表,再查詢data表。因為meta數(shù)據(jù)一般都很小,因此查詢效率相比查詢data要高,多一次查詢并不會明顯增加延遲。

meta表設(shè)計

由于GridDataSetId可以唯一標記一個GridDataSet,所以meta表的主鍵只有一列,用于記錄GridDataSetId。各種系統(tǒng)屬性和自定義屬性保存在meta表的屬性列中。


meta表設(shè)計

查詢meta表有兩種方式:一種是通過GridDataSetId直接查詢,另外一種是通過多元索引??梢愿鶕?jù)多種屬性條件組合進行查詢,例如篩選某種類型的數(shù)據(jù),按照入庫時間從新到老返回等。

data表設(shè)計

data表的設(shè)計要解決五維數(shù)據(jù)在不同的切分模式下的查詢效率問題,不能簡單直接的對數(shù)據(jù)進行存儲。

為了高效查詢,需要盡量減少一次查詢需要掃描的數(shù)據(jù)量。一個數(shù)據(jù)集的數(shù)據(jù)量可能在幾GB的級別,但是一次查詢往往只需要其中的幾MB的數(shù)據(jù),如果無法高效的定位要查詢的數(shù)據(jù),那么就要掃描全部的幾GB的數(shù)據(jù),從中篩選出符合某個范圍的數(shù)據(jù),顯然效率是很低的。如何才能高效定位到需要的數(shù)據(jù)之中是提高查詢效率的關(guān)鍵。

合理的表結(jié)構(gòu)設(shè)計可以提高查詢效率,在設(shè)計表data時,使用四個主鍵列:
主鍵 說明
GridDataSetId 數(shù)據(jù)集Id,唯一標記這個數(shù)據(jù)集。
Variable 變量名,即五維模型中的第一維。
Time 時間,即五維模型中的第二維。
Z 高度,即五維模型中的第三維。

data表設(shè)計

這四列主鍵列標記一行表格存儲中的數(shù)據(jù),這行數(shù)據(jù)需要保存后兩維的數(shù)據(jù),即一個格點平面。

這種設(shè)計下,五維中的前三維都可以通過主鍵列的值來定位,即對于前三維的每一種情況,都對應表格存儲中的一行。由于前三維分別代表變量、時間和高度,一般不會很多,每個維度在幾個到幾十個的級別,可以通過一些并行查詢的方法來加速查詢速度。

后兩維代表了一個水平的平面,一般是一個經(jīng)緯度網(wǎng)格,這兩維的大小是比前三維要大很多的,每維在幾百到幾千的級別,隨著數(shù)值預報越來越精細化,這個網(wǎng)格的大小還會成倍增加。這樣的一個稠密的網(wǎng)格數(shù)據(jù),不能把每個格點都用一列來保存,這樣列的數(shù)量會非常多,存儲效率也會非常的低。另一方面,如果我們把一個平面的格點數(shù)據(jù)存儲到一列中,在整讀整取時效率比較高,但是如果只讀取某個點,就會讀取很多的無效數(shù)據(jù),效率又會變得比較低。因此我們采取一種折中的方案,對平面的二維數(shù)據(jù)再次進行切分,切分成更小的平面數(shù)據(jù)塊,這樣就可以做到只讀取部分數(shù)據(jù)塊,而不總是讀取整個平面,因此極大的提高了查詢性能。


data表設(shè)計