如何在hbase中筛选列上的键值数组?

pxy2qtax  于 2021-06-10  发布在  Hbase
关注(0)|答案(2)|浏览(416)

我的hbase表有一个包含键值对数组的列。
我读到了 row-key , column family 或者 column , custom filter 不过,
我需要扫描列,其中持有特定的关键字名称,如。。。

  1. ROW1 , CF1, DATA_COLUMN : {KEY1:VALUE, KEY2:VALUE, KEY3:VALUE }
  2. ROW2 , CF1, DATA_COLUMN : {KEY1:VALUE}
  3. ROW3 , CF1, DATA_COLUMN : {KEY1:VALUE, KEY5:VALUE}
  4. ROW4 , CF1, DATA_COLUMN : {KEY8:VALUE} <--- Only needed row with KEY8 value set

我正在研究rdbms Package 器,但我认为还有更有效的方法。如有任何建议,将不胜感激。

4si2a6ki

4si2a6ki1#

使用 SingleColumnValueFilter 以及 SubstringComparator :

  1. SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
  2. Bytes.toBytes("CF1"),
  3. Bytes.toBytes("DATA_COLUMN"),
  4. CompareFilter.CompareOp.EQUAL,
  5. new SubstringComparator("KEY8")
  6. );
  7. Scan scan = new Scan();
  8. scan.setFilter(singleColumnValueFilter);
  9. ResultScanner resultScanner = table.getScanner(scan);

如果你需要做得更精确(例如 VALUE 在您的示例中包含 KEY8 ,将出现意外的结果),您需要自己构建一个自定义筛选器。

jdgnovmf

jdgnovmf2#

可以使用rowprefixfilter。
为此,可以使用hbase库来使用scan对象

  1. this.configuration = HBaseConfiguration.create();
  2. this.connection = ConnectionFactory.createConnection(this.configuration);
  3. String columnFamily = "CF1";
  4. String columnName = "name";
  5. String pattern = "KEY8";
  6. Table table = this.connection.getTable(TableName.valueOf("myTable"));
  7. Scan scan = new Scan();
  8. scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));
  9. scan.setRowPrefixFilter(Bytes.toBytes(pattern));
  10. ResultScanner rs = table.getScanner(scan);
  11. try {
  12. for (Result r = rs.next(); r != null; r = rs.next()) {
  13. byte[] value = r.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));
  14. String valueStr = Bytes.toString(value);
  15. System.out.println("row key "+new String(r.getRow()));
  16. System.out.println("Scan result :" + valueStr);
  17. }
  18. } finally {
  19. rs.close(); // always close the ResultScanner!
  20. }

这将返回键为8的行的值

展开查看全部

相关问题