2012-06-10 68 views
0

我有一個HBase表(來自java),我想通過鍵列表查詢表。我做了以下,但它不工作。使用RowFilter查詢HBase表使用RowFilter不工作

mFilterFeatureIt = mFeatureSet.iterator(); 
FilterList filterList=new FilterList(FilterList.Operator.MUST_PASS_ONE); 

while (mFilterFeatureIt.hasNext()) { 
    long myfeatureId = mFilterFeatureIt.next(); 
System.out.println("FeatureId:"+myfeatureId+" , "); 
RowFilter filter = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(myfeatureId))); 
filterList.addFilter(filter); 
} 

outputMap = HbaseUtils.getHbaseData("mytable", filterList); 
System.out.println("Size of outputMap map:"+ outputMap.szie()); 

public static Map<String, Map<String, String>> getHbaseData(String table, FilterList filter) { 

    Map<String, Map<String, String>> data = new HashMap<String, Map<String, String>>(); 
HTable htable = null; 
try { 
    htable = new HTable(HTableConfiguration.getHTableConfiguration(),table); 
    Scan scan = new Scan(); 
    scan.setFilter(filter); 

    ResultScanner resultScanner = htable.getScanner(scan); 
    Iterator<Result> results = resultScanner.iterator(); 

    while (results.hasNext()) { 

    Result result = results.next(); 
    String rowId = Bytes.toString(result.getRow()); 
    List<KeyValue> columns = result.list(); 
    if (null != columns) { 

    HashMap<String, String> colData = new HashMap<String, String>(); 
    for (KeyValue column : columns) { 
     colData.put(Bytes.toString(column.getFamily()) + ":"+ Bytes.toString(column.getQualifier()),Bytes.toString(column.getValue())); 
    } 
       data.put(rowId, colData); 
    } 

    } 

    } catch (IOException e) { 
    e.printStackTrace(); 
    } finally { 
     if (htable != null) 
    try { 
    htable.close(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
    } 
    return data; 
} 

FEATUREID:80515900, FEATUREID:80515901, FEATUREID:80515902,

outputMap地圖的大小:0

我看到的功能ID的這個值是我想要的,但我一直即使key存在於hbase表中,也可以獲得上述輸出。誰能告訴我我做錯了什麼?

編輯: 我發佈了我的hbase util方法的代碼,以便您可以指向我的任何錯誤。

我試圖做一個SQL等效的select * FROM mytable where featureId in (80515900, 80515901, 80515902)我在HBase中實現相同的想法是爲每個featureId創建一個帶有一個過濾器的過濾器列表。那是對的嗎 ?

這裏是我的表

scan 'mytable', {COLUMNS => ['sample:tag_count'] } 

80515900           column=sample:tag_count, timestamp=1339304052748, value=4                         
80515901           column=sample:tag_count, timestamp=1339304052748, value=0                         
80515902           column=sample:tag_count, timestamp=1339304052748, value=3  
80515903           column=sample:tag_count, timestamp=1339304052748, value=1                         
80515904           column=sample:tag_count, timestamp=1339304052748, value=2                         
+0

看看我編輯的答案 –

回答

2

在將數據插入hbase時不返回任何數據,
密鑰的數據類型爲'String'(來自您的掃描結果)&獲取時,在RowFilter中傳遞的值具有'長'數據類型。使用此篩選器:

RowFilter filter = new RowFilter(CompareOp.EQUAL,new  
BinaryComparator(Bytes.toBytes(myfeatureId.toString()))); 
+0

我想通了,但忘了回答我的問題。感謝您的答案:) – srini

+0

@Sandeep:作爲hbase的新手,只是想知道你怎麼能從掃描結果中得知key的數據類型是String?從輸出中,所有的鍵都是數字。 – VikasG

+0

@VikasG,如果插入密鑰作爲數據類型的值,只要比你將看到對應字節&在輸出,你看到標記,但是這是數字串。 –

0

while循環會一直生成一個新的過濾器並添加到過濾器列表的內容。

該電路是過濾器中的所有鍵。此過濾器不能應用於單排。在while循環中只創建一個指向知道「myfeatureId」的過濾器。

while (mFilterFeatureIt.hasNext()) { 
    long myfeatureId = mFilterFeatureIt.next(); 
System.out.println("FeatureId:"+myfeatureId+" , "); 
if (myfeatureId=="80515902") { 
    RowFilter filter = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(myfeatureId))); 
    filterList.addFilter(filter); 
    } 
} 

EDIT

對於行數量,查詢負責。 HBase的不

HBase的過濾器

過濾器推行選擇標準出到HBase的。行可以遠程並行地過濾。使用這些函數可以幫助您避免向客戶端發送不需要的行。

得到一份兼職走出關鍵的,得到所有從80515900 .. 80515909試試這個

當然,從環取出

RowFilter filter = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(myfeatureId))); 
filterList.addFilter(filter); 

,並添加行上述outputMap = HbaseUtils.getHbaseData("mytable", filterList);

.... 
RowFilter filter = new RowFilter(CompareOp.EQUAL,new SubStringComparator("8051590")); 
filterList.addFilter(filter); 
outputMap = HbaseUtils.getHbaseData("mytable", filterList); 
+0

你可以看看我編輯的問題。我現在更清楚了。我如何實現HBase中的SQL等價物? – srini

+0

我無法爲我的數據定義範圍。我不認爲一個StringComparator會工作。您可以在我的示例中看到我想要選擇(80515900,80515901,80515902)但不是(80515903,80515904)。它甚至可以是90515903等。 – srini

+0

用於將「CompareOp.EQUAL」替換爲「CompareOp.LESS_OR_EQUAL」和SubStringComparator(「80515902」)。 –