2016-07-21 11 views
1

私のHbaseテーブルには、キーと値のペアの配列を含む列があります。HBaseの列のキー値の配列をフィルタリングする方法は?

私はRDBMSラッパーの周りにブッシュが、もっと何かしてい

ROW1 , CF1, DATA_COLUMN : {KEY1:VALUE, KEY2:VALUE, KEY3:VALUE } 
ROW2 , CF1, DATA_COLUMN : {KEY1:VALUE} 
ROW3 , CF1, DATA_COLUMN : {KEY1:VALUE, KEY5:VALUE} 
ROW4 , CF1, DATA_COLUMN : {KEY8:VALUE} <--- Only needed row with KEY8 value set 

...私のような特定のキーの名前を保持する列をスキャン必要

、しかし程度row-keycolumn familyまたはcolumncustom filterを読みます効率的な方法が存在すると思います。アドバイスをいただければ幸いです。

+0

あなたの値はjsonスタイルの文字列で、値が "KEY8"の行を探したいだけですか? –

答えて

1

RowPrefixFilterを使用できます。

あなたはSingleColumnValueFilterSubstringComparatorを使用してください。これは、KEY8

+0

カラム名は 'KEYn'ではなく' DATA'です。私は私の質問を編集しました。おじゃまします。 – KIM

+0

key8で始まるすべての行が必要ですか? –

+0

私は自分の答えを編集したので、KEY8で始まるすべての行を簡単に取得できます –

3

であなたの行の値を返す必要があり、スキャン対象

this.configuration = HBaseConfiguration.create(); 
this.connection = ConnectionFactory.createConnection(this.configuration); 


String columnFamily = "CF1"; 
String columnName = "name"; 
String pattern = "KEY8"; 

Table table = this.connection.getTable(TableName.valueOf("myTable")); 
Scan scan = new Scan(); 
scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName)); 
scan.setRowPrefixFilter(Bytes.toBytes(pattern)); 
ResultScanner rs = table.getScanner(scan); 
try { 
    for (Result r = rs.next(); r != null; r = rs.next()) { 
     byte[] value = r.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName)); 
     String valueStr = Bytes.toString(value); 
     System.out.println("row key "+new String(r.getRow())); 
     System.out.println("Scan result :" + valueStr); 
     } 
    } finally { 
     rs.close(); // always close the ResultScanner! 
    } 

を使用して、このためのHBaseライブラリを使用します。

SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
      Bytes.toBytes("CF1"), 
      Bytes.toBytes("DATA_COLUMN"), 
      CompareFilter.CompareOp.EQUAL, 
      new SubstringComparator("KEY8") 
    ); 
    Scan scan = new Scan(); 
    scan.setFilter(singleColumnValueFilter); 
    ResultScanner resultScanner = table.getScanner(scan); 

をした場合より正確に行う必要があります(例:VALUEKEY8が含まれていると、予期しない結果が発生します)。あなた自身でカスタムフィルタを構築する必要があります。

関連する問題