Pinot中的Forward Index原始碼分析

2021-07-11 04:06:26 字數 1727 閱讀 2870

還是以quickstart為例,說一下forward index的建立過程。

收集各個column的統計資料

**同dictionary index。

再次遍歷,按行處理每列的索引

iterator復位

// build the index

recordreader.rewind();

重新遍歷,對每行索引

logger.info("start building indexcreator!");

while (recordreader.hasnext())

indexrow的實現:

@override

public

void

indexrow(genericrow row) else

forwardindexcreatormap.get(column).index(docidcounter, dictionaryindex);

if (config.createinvertedindexenabled())

}docidcounter++;

}

對每乙個值,都需要在dictionary index中呼叫indexof以得到該值的位置。

public object indexof(object e)  else 

}

對於single value field來說,用二分查詢找位置,時間複雜度o(lgn)。不過找到之後會放在map裡,所以對於重複的value就是o(1)的時間複雜度了。

private integer indexofsv(object e) 

return

new integer(searchablebytebuffer.binarysearch(0, bld.tostring()));

default:

break;

}throw

new unsupportedoperationexception("unsupported data type : " + spec.getdatatype() + " : " + " for column : "

+ spec.getname());

}

在forward index中實際儲存的是int,和column的type沒有關係。

@override

public

void

index(int docid, object e)

公式有點複雜,根據volumn的寬度來直接定位第n位的位置。注意column都是等寬的。對於string這種不等寬的column,會加padding變為等寬。

public

void

setint(int row, int col, int val)

}}

簡單來說,forward index包含的內容就是乙個一維陣列,每個元素對應該行該列的值在dictionary index中的位置。真正得到這個值就需要在dictionary index中進行一次o(1)的查詢。

rowid

value……

mi (第m行的值在dictionary index中的位置)……

nj (第n行的值在dictionary index中的位置)……

Python中的descriptor中的一點疑問

在我的印象中,類中的函式是可以有兩種呼叫方式的,如下 class b def func self return 10 b b b.func b.func b 於是,在之前研究descriptor的時候,我就有了幾點困惑 我將 更換成了如下兩個版本 版本1 import time class lazy...

python中的dict Python中的dict

dict python內建了字典 dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵 值 key value 儲存,具有極快的查詢速度。d print dict get michael d michael add a element d adam 67 print d...

zset中的score Redis中的事務

watch 監控某個或幾個key的變化 multi 接下來的命令不會立馬執行,會先放入乙個事務的佇列中 exec 執行事務佇列中的命令 unwatch 可以在watch執行之後 multi命令執行之前執行,效果是解除對某個key的監控 discard 可以在multi命令執行之後exec命令執行之前...