KeyValue元數(shù)據(jù)

2018-05-18 13:55 更新

KeyValue元數(shù)據(jù)

由于HBase在內(nèi)部將數(shù)據(jù)存儲(chǔ)為KeyValue對(duì),因此KeyValue元數(shù)據(jù)過(guò)濾器(KeyValue Metadata Filters)會(huì)評(píng)估一行中是否存在鍵(即,ColumnFamily:列限定符),而不是前一節(jié)中的值。

FamilyFilter

FamilyFilter可用于過(guò)濾ColumnFamily。在掃描(Scan)中選擇ColumnFamilies通常比在過(guò)濾器(Filter)中選擇ColumnFamilies更好。

QualifierFilter

QualifierFilter可用于基于列(aka Qualifier)名稱(chēng)進(jìn)行過(guò)濾。

ColumnPrefixFilter

ColumnPrefixFilter可用于基于列(又名限定符)名稱(chēng)的主要部分進(jìn)行過(guò)濾。

ColumnPrefixFilter提前查找匹配每行前綴和每個(gè)涉及列族的第一列。它可以用來(lái)高效地獲取非常寬的行中的一個(gè)列的子集。

注意:同一列限定符可用于不同的列族。此過(guò)濾器將返回所有匹配的列。

示例:查找以“abc”開(kāi)頭的行和家族中的所有列

Table t = ...;
byte[] row = ...;
byte[] family = ...;
byte[] prefix = Bytes.toBytes("abc");
Scan scan = new Scan(row, row); // (optional) limit to one row
scan.addFamily(family); // (optional) limit to one family
Filter f = new ColumnPrefixFilter(prefix);
scan.setFilter(f);
scan.setBatch(10); // set this if there could be many columns returned
ResultScanner rs = t.getScanner(scan);
for (Result r = rs.next(); r != null; r = rs.next()) {
  for (KeyValue kv : r.raw()) {
    // each kv represents a column
  }
}
rs.close();

MultipleColumnPrefixFilter

MultipleColumnPrefixFilter的行為類(lèi)似于ColumnPrefixFilter,但允許指定多個(gè)前綴。

像ColumnPrefixFilter一樣,MultipleColumnPrefixFilter可以高效地搜索與最低前綴匹配的第一列,并且在前綴之間查找過(guò)去的列范圍。它可以用來(lái)從很寬的行中有效地獲得不連續(xù)的列集。

示例:查找以“abc”或“xyz”開(kāi)頭的行和家族中的所有列

Table t = ...;
byte[] row = ...;
byte[] family = ...;
byte[][] prefixes = new byte[][] {Bytes.toBytes("abc"), Bytes.toBytes("xyz")};
Scan scan = new Scan(row, row); // (optional) limit to one row
scan.addFamily(family); // (optional) limit to one family
Filter f = new MultipleColumnPrefixFilter(prefixes);
scan.setFilter(f);
scan.setBatch(10); // set this if there could be many columns returned
ResultScanner rs = t.getScanner(scan);
for (Result r = rs.next(); r != null; r = rs.next()) {
  for (KeyValue kv : r.raw()) {
    // each kv represents a column
  }
}
rs.close();

ColumnRangeFilter

ColumnRangeFilter允許有效的幀內(nèi)行掃描。

ColumnRangeFilter可以為每個(gè)涉及的列族尋找第一個(gè)匹配列。它可以用來(lái)有效地獲得非常寬的行的“切片”。即,你連續(xù)有一百萬(wàn)列,但你只想看看列bbbb-bbdd。

注意:同一列限定符可用于不同的列族。此過(guò)濾器將返回所有匹配的列。

示例:查找“bbbb”(含)和“bbdd”(含)之間的行和族中的所有列

Table t = ...;
byte[] row = ...;
byte[] family = ...;
byte[] startColumn = Bytes.toBytes("bbbb");
byte[] endColumn = Bytes.toBytes("bbdd");
Scan scan = new Scan(row, row); // (optional) limit to one row
scan.addFamily(family); // (optional) limit to one family
Filter f = new ColumnRangeFilter(startColumn, true, endColumn, true);
scan.setFilter(f);
scan.setBatch(10); // set this if there could be many columns returned
ResultScanner rs = t.getScanner(scan);
for (Result r = rs.next(); r != null; r = rs.next()) {
  for (KeyValue kv : r.raw()) {
    // each kv represents a column
  }
}
rs.close();
以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)