为快速高维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个交运算(不包括被例示的。)注意子立方体查询的结果是一个关于被询问属性的方体,而不包含被例示的值。并且是多条索引表,而不是一条。

进一步的精化的过程

目前做到了可以处理点查询的程度。处理子立方体查询在点查询的基础上进行。

现在已经做好了,这两天的主要成果就是做出这个壳片段了。

看来事情只要着手去做,就会变得简单。

具体的实现我们来看下一讲。

 

 

 

 

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