2016-02-02 53 views
2

我一直對HBase中的過濾器如何工作感到困惑(或者,大體上等同於HappyBase--我用它來與HBase進行交互)。我混亂的根源是,我似乎無法控制過濾器的功能。HBase中的過濾器:設計用於按行或按列還是兩者過濾數據?

某些過濾器(如SingleColumnValueFilter)會導致不根據其某列的值排放行。這是有道理的 - 在我看來,這是過濾器應該是的。但是,像FirstKeyOnlyFilter這樣的其他過濾器似乎不是按行方向進行過濾,而是過濾出呈現給請求者的數據 - 即,它們過濾列爲,如columns參數。不僅如此,它們似乎影響其他過濾器是否可以訪問數據。

也許我只是用它們錯了。但是,對我來說,一個「過濾器」應該根據對其屬性進行操作的輸出來移除項目,例如「找到我身高超過7英尺的所有人!」但至少在HBase中,FirstKeyOnlyFilter的行爲似乎更類似於「讓我的每個人都離開耳朵,沒有別的東西!」此外,如果我有以下過濾器:

SingleColumnValueFilter('body', 'height', =, 'regexstring:^over7ft$') AND FirstKeyOnlyFilterFirstKeyOnlyFilter似乎限制第一個過濾器訪問列族:column「body:height」。

這是什麼設計選擇?上面的過濾器看起來像是在說:「讓我身高七英尺高的每個人都明白我的名字!」而是說的更像是「如果名字高7英尺,讓我明白我的名字!」。一行中的第一個關鍵字沒有列,只有名稱可以說有一個「高度」。

我在做什麼錯?這是HappyBase的一個特點,還是與HBase本身一樣?

回答

2

過濾器匹配每行中可用的列。

正如您已經注意到一些HBase過濾器限制返回給客戶端的列。這是一種有意的設計選擇,可以減少客戶端調用期間使用的內存和網絡資源的數量。回想一下,HBase實際上是對一系列鍵值對(key-value中的鍵被稱爲列限定符)的rowkey映射。它們不是嚴格意義上的底層數據抽象集合,它實際上是一個rowkey + columnQualifier(cell)。過濾器在單元級別工作。這也是爲什麼列限定符被推薦爲短的原因,因爲它們實際上與每行/值一起存儲。

FirstKeyOnlyFilter旨在恢復儘可能少的數據成爲可能,同時保持一個rowkey也有一些鍵 - 值映射存在的知識。它可以是任何返回的鍵值映射。

或者,您可以使用KeyOnlyFilter而不是FirstKeyOnlyFilter,它將清空與返回的每列相關聯的值。這應該使您能夠根據需要進行匹配,同時最大限度地減少返回的數據。

+0

有趣。但是,如果我想減少網絡I/O但不一定從數據庫讀取數據呢?即,「回到我身邊所有的行鍵,其中該行已比照:x的C值」 – eriophora

+0

我已經更新了答案 –

+0

@eriophora回答您的評論以上:使用columnvalue過濾器和FirstKeyOnlyFilter並傳遞參數「必須全部匹配」到您的掃描對象。 – halil