2012-10-12 12 views

risposta

9

Immagino che stiate cercando SingleColumnValueFilter in HBase. Come accennato nella API

Per evitare che l'intera riga venga emessa se la colonna non si trova su una riga, utilizzare setFilterIfMissing(boolean) sull'oggetto filtro. Altrimenti, se la colonna viene trovata, l'intera riga verrà emessa solo se il valore viene superato. Se il valore fallisce, la riga verrà filtrata.

Ma SingleColumnValueFilter vorrebbe un valore di avere Colonna X "CompareOp" a qualcosa, dire portare questa riga se Columnx == "X" o portare questa riga se Columnx! = "Un valore sentinella che può Columnx mai prendere "e setFilterIfMissing(true) in modo che se ColumnX ha qualche valore, viene restituito.

Spero che questo ti spinga nella giusta direzione.

+0

grazie mille. ha aiutato molto sottoalanciato – Sanket

1

È possibile utilizzare uno SkipFilter insieme a ColumnPrefixFilter. ColumnPrefixFilter ottiene le chiavi in ​​cui esiste la colonna (una riga HBase avrà una colonna solo se ha un valore) il filtro Salta ti darà il "Not" sul primo filtro, quindi la riga verrà omessa

+0

Nota, questo passerà solo sulle righe in cui _all_ le colonne nella riga passano il filtro prefisso –

0

Ankit Utente Arnon1573269

L'unico modo ho potuto farlo funzionare, è come sotto

così - ho una tabella con le colonne Regola1, Regola2, Regola3 e così via. Le righe possono avere solo la colonna rule1, o rule1 e rule2, o rule1 e rule2 e rule3 e così via. Dire - Voglio estrarre le righe che contengono SOLO regola1. Ora questo significa che dovrò saltare le righe che contengono la regola2.

Scan getRules = new Scan(); 
    ColumnPrefixFilter rule1Filter = new ColumnPrefixFilter(Bytes.toBytes("rule1")); 
    SingleColumnValueFilter skipRule2Value = new  SingleColumnValueFilter(Bytes.toBytes("rules"),Bytes.toBytes("rule2"), 
    CompareOp.EQUAL,Bytes.toBytes("0")); 
    SkipFilter skipRule2 = new SkipFilter(skipRule2Value); 
    getRules.setFilter(rule1Filter); 
    getRules.setFilter(skipRule2); 
    ResultScanner scanner = htable.getScanner(getRules); 

Anche se ha funzionato, non sono molto soddisfatto della soluzione. Ci vuole tempo per capire da parte di hbase. Avrei pensato che ci dovrebbe essere un metodo più semplice e diretto che non deve controllare il valore. Arnon, il tuo metodo non funziona perché SkipFilter salterà quelli che DONOT soddisfa la condizione. Quindi costruirlo da un ColumnPrefixFilter fallisce il requisito.