2016-02-02 3 views
6

Filterliste für einzelne SpalteFamily funktioniert, aber für mehrere columnFamily gibt 0 Zeilen zurück. Problembeschreibung ist das gleiche wie How to apply several QualifierFilter to a row in HBaseHbase-Filter für mehrere colummnFamily und qualifierRange gibt 0 Zeilen zurück

aber ich kann nicht SingleColumnValueFilter als Spalte Qualifikationsmerkmal ist ein Zeitstempel. so mein Filter wie folgt aussieht:

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) 

Was wäre der richtige Weg sein, nur die Zeilen aus der Tabelle zu erhalten, die outer_fl_A UND outer_fl_B haben Sie?

Antwort

1

Wenn outer_fl_A, outer_fl_B unterschiedliche Spaltenfamilien oder dasselbe ist, wenn Werte für einen Ihrer Filter zulässig sind, sollten Sie OR verwenden, um Filter zum Scannen hinzuzufügen.

+0

ja, outer_fl_A und outer_fl_B sind unterschiedliche Spaltenfamilien. und ich möchte Werte in Frage, wo A und B beide wahr sind. – Abhi

1

Dies ist sehr schwer mit HBase zu implementieren. Der Grund für Ihr Problem ist, dass Verbundfilter (Listen) Prädikate auf der KV-Ebene, nicht auf einer ROW-Ebene ausgewertet werden.

So eine Abfrage wie

geben Sie mir alle Zeilen, die (Werte in) ColFam1 AND (Werte in) ColFam2 haben und kehren auch ColFam3 in den Ergebnissen

unmöglich ist, zu lösen, mit die Standard-Filtersets, die in der HBase-Verteilung bereitgestellt werden. Remember FilterLists tun eine MUST_PASS_ALL Auswertung standardmäßig, wenn der Scanner eine KV wie ColFam1:qualifX somevalue bewerten soll, wird es die Frage stellen "ist die CF gleich" ColFam1 "UND gleich" ColFam2 "? Was natürlich niemals wahr ist. Wenn Sie zu MUST_PASS_ONE wechseln, enthalten Ihre Ergebnisse unbeabsichtigt auch Zeilen mit ColFam1, aber nicht ColFam2 oder umgekehrt oder beides.

So glaube nicht, SQL-ähnliche/row-basierte, wo man sagen kann:

die Reihe col1 = A haben muss und col2 = B

HBase ColumnRangeFilter und (Mulitple) ColumnPrefixFilter kann Ihnen in einigen Anwendungsfällen helfen, aber sie funktionieren alle nur auf der Qualifikationsstufe

+0

danke für die Erklärung des zugrunde liegenden Algorithmus in HBase, ich habe dies mit einem anderen Ansatz implementieren und es funktioniert gut. Können Sie mir bitte sagen, ob Filtergrenzen in der Filterliste hinzugefügt werden dürfen? Wenn ich 7 Filter in einer Filterliste hinzufüge, wird FilterList OR (5/7) angezeigt, und es werden nur 5 Werte berücksichtigt. – Abhi

+0

@Manjeet, gibt es keine Begrenzung für die Anzahl der Filter, die Sie stapeln können, aber ich fand Hbase (0,94 in meinem Fall) sehr wählerisch über die Reihenfolge mehrerer Filter in einer Filterliste. Ich musste sie in die richtige Reihenfolge bringen, um zu der gewünschten Ergebnismenge zu kommen. Aber die Logik dessen, was "richtig" war, entzieht sich mir, aber offensichtlich gibt es eine Hierarchie in der Anwendung von mehreren Filtern auf eine KV und/oder Zeile – DataHacker

Verwandte Themen