2016-12-27 55 views
2

。我需要那些不存在特定列的行。 我嘗試了多種方法,但似乎沒有工作。HBASE:與列過濾器掃描(獲取它確實有一個特定的列行)我試圖用掃描讀取行

讓說我要行,其中列「FS」是不存在的。 我曾嘗試以下: -

SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
         "f".getBytes(), 
         Bytes.toBytes("fs"), 
         CompareOp.NOT_EQUAL, 
         Bytes.toBytes(1) 
         ); 

假設,如果「FS」是目前它就會有值1

這是行不通的。 也試過什麼是這裏 How can I skip HBase rows that are missing specific columns?提及,但同樣喧囂工作。

+0

有關SkipFilter的建議是錯誤的,如果任何單元格與過濾條件不匹配,它會過濾整行。我猜你的'fs'列的行也有其他一些列,並被過濾。 – AdamSkywalker

+0

是的,他們也有其他專欄 – Peter

回答

1

SkipFilterthis answer的建議沒有錯,但不適用於您的情況(正如@AdamSkywalker指出的那樣)。

但是你可以創建爲範圍的ColumnRangeFilters頂部[「0」,「FS」)和(「FS」,「Z」]兩個獨立SkipFilters,而這些過濾器應與FilterListMUST_PASS_ONE FilterList的組合規則進行組合。

示例代碼可以在HBase的外殼進行測試:

import org.apache.hadoop.hbase.util.Bytes 
import org.apache.hadoop.hbase.filter.ColumnRangeFilter 
import org.apache.hadoop.hbase.filter.SkipFilter 
import org.apache.hadoop.hbase.filter.FilterList 
import org.apache.hadoop.hbase.filter.FilterList.Operator 
scan 'table', {FILTER => FilterList.new(FilterList::Operator::MUST_PASS_ONE,SkipFilter.new(ColumnRangeFilter.new(Bytes.toBytes("0"), true, Bytes.toBytes("fs"), false)),SkipFilter.new(ColumnRangeFilter.new(Bytes.toBytes("fs"), false, Bytes.toBytes("z"), true)))} 

在Java API代碼的過濾器看起來應該:

SkipFilter range1 = new SkipFilter(new ColumnRangeFilter(Bytes.toBytes("0"), true, Bytes.toBytes("fs"), false)); 
SkipFilter range2 = new SkipFilter(new ColumnRangeFilter(Bytes.toBytes("fs"), false, Bytes.toBytes("z"), true)) 
FilterList filter = new FilterList(FilterList.Operator.MUST_PASS_ONE, range1, range2) 

請注意,在此示例中,列名稱範圍僅限於可打印符號。如果你使用字節數組作爲列名,你應該定義更寬的範圍。