Voglio eseguire una scansione di base con i filtri. Ad esempio, la mia tabella ha una famiglia di colonne A, B, C e A ha una colonna X. Alcune righe hanno la colonna X e altre no. Come posso implementare il filtro per filtrare tutte le righe con la colonna X?Come filtrare le righe con la colonna data (non null)?
risposta
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.
È 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
Nota, questo passerà solo sulle righe in cui _all_ le colonne nella riga passano il filtro prefisso –
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.
grazie mille. ha aiutato molto sottoalanciato – Sanket