2016-02-02 30 views
6

Elenco filtri su singola colonna Famiglia funziona ma su più colonneI familiari restituisce 0 righe. La dichiarazione del problema è uguale a How to apply several QualifierFilter to a row in HBaseHbase filters on multiple colummnFamiglia e qualificatoreRange restituisce 0 righe

ma non posso usare SingleColumnValueFilter come il qualificatore di colonna è un timestamp. quindi il mio filtro assomiglia:

val master_filter_list = new FilterList() 

    val outer_fl_A = new FilterList() 
    val cf_filter = new FamilyFilter (CompareOp.EQUAL, new BinaryComparator("ac".getBytes)) 
    val qualifier_range = new ColumnRangeFilter(Bytes.toBytes(fromDate.getMillis), true, Bytes.toBytes(toDate.getMillis), true) 
    val ac_fl = new ValueFilter(comparison_operator, new BinaryComparator(Bytes.toBytes(value.toString.toInt))) 
    outer_fl_A.addFilter(cf_filter) 
    outer_fl_A.addFilter(qualifier_range) 
    outer_fl_A.addFilter(ac_fl) 
master_filter_list.addFilter(outer_fl_A) 

    val outer_fl_B = new FilterList() 
    val cf_filter = new FamilyFilter (CompareOp.EQUAL, new BinaryComparator("t".getBytes)) 
    val qualifier_range = new ColumnRangeFilter(Bytes.toBytes(fromDate.getMillis), true, Bytes.toBytes(toDate.getMillis), true) 
    val ts_fl = new ValueFilter(comparison_operator, new BinaryComparator(value.toString.getBytes)) 
    outer_fl_B.addFilter(cf_filter) 
    outer_fl_B.addFilter(qualifier_range) 
    outer_fl_B.addFilter(ts_fl) 
    master_filter_list.addFilter(outer_fl_B) 

Quale sarebbe il modo giusto per ottenere solo le righe della tabella che non hanno outer_fl_A E outer_fl_B?

risposta

1

Se outer_fl_A, outer_fl_B sono famiglie di colonne diverse o uguali, se si desidera valori idonei per uno dei filtri, è necessario utilizzare OR per aggiungere filtri per la scansione.

+0

sì, outer_fl_A e external_fl_B sono famiglie di colonne diverse. e voglio i valori ammissibili dove A e B sono entrambi veri. – Abhi

1

Questa è una cosa molto difficile da implementare con HBase. La radice del problema è che i predicati del filtro composto (elenco) vengono valutati a livello di KV, non a livello di RIGA.

Quindi una query come

darmi tutte le righe che hanno (valori in) ColFam1 E (valori in) ColFam2 e anche restituire ColFam3 nei risultati

è impossibile da risolvere con i filtri standard forniti nella distribuzione HBase. Ricordate che le liste di filtri fanno una valutazione MUST_PASS_ALL di default così quando lo scanner deve valutare un KV come ColFam1:qualifX somevalue chiederà la domanda 'il CF è uguale a' ColFam1 'E uguale a' ColFam2 '? Che fuori rotta non è mai vero. Quando si passa a MUST_PASS_ONE i risultati includeranno involontariamente anche le righe con ColFam1 ma NON ColFam2 o viceversa o entrambe.

Quindi non credo SQL-like/row-based in cui si può dire:

riga deve avere col1 = A e B = col2

HBase ColumnRangeFilter e (Mulitple) ColumnPrefixFilter può aiutarti in alcuni casi d'uso, ma funzionano tutti solo a livello di qualificatore

+0

grazie per aver spiegato l'algoritmo sottostante in hbase, ho implementato questo approccio con un altro approccio e sta funzionando bene. Puoi dirmi se c'è un limite massimo di filtri da aggiungere nella lista dei filtri. beacuase quando aggiungo 7 filtri in una lista di filtri che mostra, FilterList OR (5/7), e sta considerando solo 5 valori. – Abhi

+0

@Manjeet, non c'è limite al numero di filtri che è possibile impilare, ma ho trovato Hbase (0,94 nel mio caso) molto pignolo sull'ordine di più filtri in una FilterList. Ho dovuto metterli nell'ordine 'giusto' per arrivare al set di risultati desiderato. Ma la logica di ciò che era "giusto" mi sfugge, ma ovviamente c'è una gerarchia nell'applicazione di più filtri a un KV e/o riga – DataHacker