為快速高維OLAP實現殼片段shell-fragment的方法(初步設想)
初步設想
- 把資料存入資料庫。額,怎麼也插不進去,最後發現,left這個欄位名不被接受,有可能是和mysql的關鍵字衝突了,所以不被允許,改了之後就可以了。
- 如何為每一個維集合也就是每一個片段計算立方體呢?根據每一個維的每一個值的倒排索引表唄。倒排索引表以字串的格式存在數組裡。物化的時候(計算這個殼片段的立方體的時候)再從資料庫中取出來放在陣列中進行交運算。這樣立方體就計算出來了。
- 怎麼存倒排索引?key是一個【String,String】然後value是一個【int,int,int】,用Hashmap來存。此時計算的這些就是所謂的殼片段(立方體)了。為了更逼真地模擬殼片段的實際使用過程,我把計算出來的殼片段也放入mysql資料庫。
- 如何用殼片段處理點查詢? 首先需要對點查詢進行劃分,劃分需要與預先計算的殼片段相一致。劃分完之後,對於每一個劃分子集,一次遍歷所有的殼片段,即可獲得倒排索引表,然後取這些倒排索引表的交即可。
現在拿到了每一個欄位的倒排索引表。需要對7個維劃分殼片段。然後針對每一個殼片段計算立方體。
輸入:一個欄位名陣列。包含兩個欄位。
輸出:產生一張表,每個欄位是方體的一個單元,然後每個欄位都有一個索引列表字串。
函式首先讀取兩個欄位的索引table。然後(根據兩個屬性集的交)產生新的table。所以也就是說,需要根據原來的兩個欄位名陣列,生成這樣的一個欄位名的陣列。然後根據兩個表名合併成新的表名。然後建立表。
建立完成後需要插入資料。每一個數據的計算需要原來兩個表對應的兩條資料進行交運算。此處需要子函式。輸入:兩個表名,輸出一個hashmap,key是兩個屬性的名字合併的新的表名(要與前面的相同喲)。value是可以放到資料庫中的索引值的字串。這樣可以對應資料庫中相應的欄位名,把hashmap中的資料往裡面填進去。
目前完成了資料立方體的物化。
物化片段是【dept,salary,number_project】 以及【already_left, promotion_last_5years】
現在把剩餘的兩個workaccident和time_spend_company作為未被物化的兩個倒排索引表。
下面進行測試。
給定查詢
marketing high 3 * * * * *。則需要對陣列劃分,分塊去掃描索引表。
對於第一個殼片段來說,需要寫一個特定的函式。處理查詢時直接去掃描對應該片段的索引表。當然要把這三個值用9連結。
掃描到對應的欄位之後,直接拿出來對應的索引表的一條。另外的殼片段同理。但是對於另外的單條的,其實處理方法類似,不過函式可以寫一個可以統一處理的。對於*標記的列,不做處理即可。
對於含有子立方體的查詢。正確處理?所在的列即可。對於?的每一種取值的每一個倒排索引表,分別與例示的倒排索引表相交。也就是說,如果有兩個欄位被??,每一個有2,3種取值。此時,需要2*3個交運算(不包括被例示的。)注意子立方體查詢的結果是一個關於被詢問屬性的方體,而不包含被例示的值。並且是多條索引表,而不是一條。
進一步的精化的過程
目前做到了可以處理點查詢的程度。處理子立方體查詢在點查詢的基礎上進行。
現在已經做好了,這兩天的主要成果就是做出這個殼片段了。
看來事情只要著手去做,就會變得簡單。
具體的實現我們來看下一講。