2017-09-15 3 views
0

Mon schéma HBase ressemble comme suit:Plusieurs filtres fonctionnent pas dans HBase 1.2.6

{ 
    "<trace-id>": { 
     "span-timestamp": { 
      "ts:span:<timestamp>": "" 
     }, 
     "span-name": { 
      "ts:span:<name>": "" 
     }, 
     "span-duration": { 
      "ts:span:<duration>": "" 
     }, 
     "span-blob": { 
      "ts:span:<span-id>": "<span>" 
     }, 
     "endpoint": { 
      "ts:endpoint:<service-name>": "" 
     }, 
     "annotation": { 
      "ts:annotation:<value>": "" 
     }, 
     "binary-annotation": { 
      "ts:binary-annotation:<key>": "<value>", 
     }, 
    } 
} 

Dans mon cas, je dois interroger des qualificatifs spécifiques, donc je construit des filtres suivants:

final FilterList filters = new FilterList(Operator.MUST_PASS_ALL); 
final Charset cs = HOperation.CHARSET; 
filters.addFilter(Filters.qualifier(Schema.SCHEMA_TRACES_ENDPOINT, CompareOp.EQUAL, request.serviceName)); 
filters.addFilter(Filters.qualifier(Schema.SCHEMA_TRACES_SPAN_NAME, CompareOp.EQUAL, request.spanName)); 
filters.addFilter(Filters.qualifier(Schema.SCHEMA_TRACES_SPAN_TIMESTAMP, 
request.endTs * 1000 - request.lookback * 1000, request.endTs * 1000)); 
filters.addFilter(new PageFilter(request.limit)); 
scan.setFilter(filters); 
scan.setLoadColumnFamiliesOnDemand(true); 

Comme vous pouvez le voir, j'ai lié le filtre de famille de colonnes avec un filtre de qualificatif, ce qui signifie que la ligne ne sera retournée que si le filtre de famille et le filtre de qualificateur sont tous les deux évalués à vrai.

static FilterList qualifier(final Schema schema, final CompareOp op, final byte[] value) { 
    final FilterList list = new FilterList(Operator.MUST_PASS_ALL); 
    list.addFilter(new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(schema.cf().getBytes(HOperation.CHARSET)))); 
    list.addFilter(new QualifierFilter(op, new BinaryComparator(value))); 
    return list; 
} 

Après que j'ai essayé le code, j'ai trouvé ma méthode de recherche basée sur Table#getScanner(Scan) pourrait ne pas fonctionner correctement.

De plus, j'ai trouvé ces deux filtres ne pouvaient pas travailler ensemble:

filters.addFilter(Filters.qualifier(Schema.SCHEMA_TRACES_ENDPOINT, CompareOp.EQUAL, request.serviceName)); 
filters.addFilter(Filters.qualifier(Schema.SCHEMA_TRACES_SPAN_NAME, CompareOp.EQUAL, request.spanName)); 

En général, quand je commente sur l'un de ces deux filtres fonctionner. Bien sûr, ne fonctionne pas parfaitement, car j'en ai besoin pour retourner limit lignes, cependant, ce n'est pas le cas.

Toutes les idées seraient appréciées. Merci beaucoup!

Répondre

0

Après plusieurs jours de recherche sur HBase, j'ai finalement compris la vraie raison pour laquelle ces filtres multiples ne fonctionnent pas correctement ensemble.

Dans HBase, Filter est évidemment pour la sortie non seulement fonctionnant comme une condition.

Par exemple, si une ligne (avec une ligne de clé row) avec 3 colonnes appelées comme , cf1:1, cf2:2 (famille de la colonne est évidemment cf, cf1, cf2).


Situation 1:

L'application d'une FamilyFilter et la famille doit être cf, cela ne reviendra pas toute la famille qui correspond pas (uniquement les familles avec le nom de cf retourné pour une ligne), dans ce scénario , cf1:1 et cf2:2 ne seront pas inclus dans la valeur de retour.


Situation 2:

L'application d'un QualifierFilter et le qualificatif doit être 1, que ne cf1:1 sera retourné.


Bien sûr, ces situations devraient être faciles à comprendre.


Cependant, que diriez-vous d'appliquer ces filtres ensemble? Le résultat est intéressant.Si vous essayez d'appliquer les filtres suivants:

QualifierFilter(=,'binary:1') && QualifierFilter(=,'binary:2') 

Il semble que vous voulez obtenir des lignes à la fois qualifié 1 et 2 existe, peu importe quelle famille il appartient. En fait, vous n'obtiendrez pas row parce qu'il n'y a pas colonne correspondant à ces deux filtres en même temps.


Après tout, ce n'est pas la meilleure pratique pour utiliser HBase. Dans le chapitre 34 (règles de schéma de table du pouce) de référence officielle, il existe des suggestions pour la construction de schémas. Et cette question n'est pas mieux conçue et confondue avec RDBMS.