2014-03-31 41 views
1

我有一個Hbase表,其中包含以下說明。Hbase - 根據列名前綴獲取行的列名稱

對於一個行鍵,我的列的形式應該是a_1,a_2,a_3,b_1,c_1,C_2等格式的複合鍵格式。

我行的假設之一是形式

row key - row1 
column family - c1 
columns - a_1, a_2,a_3,b_1,b_2,c_1,C_2,d_9,d_99 

我可以通過任何操作檢索A,B,C的,d爲對應於row1列,我不打擾關於什麼是後綴對於a,b,c ...

我可以獲取給定行的所有列名稱,通過將行鍵分割爲其第一部分並將其發佈,將它們添加到set中。我很擔心,如果有更好的方式來完成它通過過濾器或其他hbase方式完成,請評論...

+0

將rowkey更改爲rowkey_columnpart1_columnpart2更好嗎? –

+0

有一個前綴過濾器,所以你會得到以某個前綴(a b或c)開頭的所有列,這會有幫助嗎? – Udy

+0

@Udy在這裏的問題是,我沒有在以前的給定的行鍵的列名信息。 –

回答

0

您可以使用COlumnPrefixFilter。你可以看到下面的代碼

Configuration hadoopConf = new Configuration(); 
    hadoopConf.set("hbase.zookeeper.quorum", "localhost"); 
    hadoopConf.set("hbase.zookeeper.property.clientPort", "2181"); 

    HTable hTable = new HTable(hadoopConf, "KunderaExamples"); 

    Scan scan = new Scan(); 
    scan.setFilter(new ColumnPrefixFilter("A".getBytes())); 
    ResultScanner scanner = hTable.getScanner(scan); 
    Iterator<Result> resultsIter = scanner.iterator(); 
    while (resultsIter.hasNext()) 
    { 

     Result result = resultsIter.next(); 

     List<KeyValue> values = result.list(); 
     for (KeyValue value : values) 
     { 
      System.out.println(value.getKey()); 
      System.out.println(new String(value.getQualifier())); 
      System.out.println(value.getValue()); 
     } 
    } 
+0

爲此,我需要知道我的行鍵有一些以A開頭的列。這裏的問題是給定行鍵的列名是未知的。 –

+0

你也可以在運行時解決它。 – kkmishra

+0

按照上面的代碼,它只是執行掃描所有列以A開頭(我可以做一個到這裏而不是掃描,我有行鍵)。除非我執行獲取和比較,否則沒有關於運行時間分辨率的規定。這不是接近我的要求的地方。 @kkmishra,我想我還沒有明白你的意思。你能詳細說明一下嗎? –