爲快速高維OLAP實現殼片段shell-fragment的方法(初步設想)

初步設想

  1. 把數據存入數據庫。額,怎麼也插不進去,最後發現,left這個字段名不被接受,有可能是和mysql的關鍵字衝突了,所以不被允許,改了之後就可以了。
  2. 如何爲每一個維集合也就是每一個片段計算立方體呢?根據每一個維的每一個值的倒排索引表唄。倒排索引表以字符串的格式存在數組裏。物化的時候(計算這個殼片段的立方體的時候)再從數據庫中取出來放在數組中進行交運算。這樣立方體就計算出來了。
  3. 怎麼存倒排索引?key是一個【String,String】然後value是一個【int,int,int】,用Hashmap來存。此時計算的這些就是所謂的殼片段(立方體)了。爲了更逼真地模擬殼片段的實際使用過程,我把計算出來的殼片段也放入mysql數據庫。
  4. 如何用殼片段處理點查詢? 首先需要對點查詢進行劃分,劃分需要與預先計算的殼片段相一致。劃分完之後,對於每一個劃分子集,一次遍歷所有的殼片段,即可獲得倒排索引表,然後取這些倒排索引表的交即可。

現在拿到了每一個字段的倒排索引表。需要對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個交運算(不包括被例示的。)注意子立方體查詢的結果是一個關於被詢問屬性的方體,而不包含被例示的值。並且是多條索引表,而不是一條。

進一步的精化的過程

目前做到了可以處理點查詢的程度。處理子立方體查詢在點查詢的基礎上進行。

現在已經做好了,這兩天的主要成果就是做出這個殼片段了。

看來事情只要着手去做,就會變得簡單。

具體的實現我們來看下一講。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章