[英]Multiple filters not work in HBase 1.2.6
我的HBase模式如下所示:
{
"<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>",
},
}
}
在我的情況下,我需要查詢特定的限定詞,因此我構造了以下過濾器:
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);
如您所見,我已將列族過濾器與限定符過濾器綁定在一起,這意味着僅當族過濾器和限定符過濾器的兩個值都為true時,才返回該行。
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;
}
在嘗試了代碼之后,我發現基於Table#getScanner(Scan)
find方法無法正常工作。
而且,我發現這兩個過濾器無法一起使用:
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));
通常,當我注釋掉這兩個過濾器中的任何一個時,它將起作用。 當然,不能完美地工作,因為我需要它返回limit
行,但是事實並非如此。
任何想法將不勝感激。 非常感謝!
在對HBase進行了幾天的研究之后,我終於弄清楚了為什么這些多個過濾器不能一起正常工作的真正原因。
在HBase中, Filter
顯然用於輸出,而不僅僅是作為條件。
例如,如果具有3列的行(具有row key row
)稱為cf:A
, cf1:1
, cf2:2
(列族顯然是cf
, cf1
, cf2
)。
情況一:
應用FamilyFilter
並且該家庭必須是cf
,這將不返回任何不匹配的家庭(僅返回名稱為cf
那些家庭一行),在這種情況下, cf1:1
和cf2:2
將不包含在返回中值。
情況2:
應用QualifierFilter
且該限定符必須為1
, cf1:1
將僅返回cf1:1
。
當然,這些情況應該很容易理解。
但是 ,如何一起應用這些過濾器? 結果很有趣。 如果您嘗試應用以下過濾器:
QualifierFilter(=,'binary:1') && QualifierFilter(=,'binary:2')
似乎您想獲得同時存在限定符1
和2
行,無論它屬於哪個家族。 實際上,由於沒有同時匹配這兩個過濾器的列 ,您不會得到row
。
畢竟,這不是使用HBase的最佳實踐。 在官方參考的第34章“ 表模式的經驗法則”中 ,提出了一些構建模式的建議。 而且這個問題不是最佳設計,並且不能與RDBMS混淆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.