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

如何在HBase中筛选列上的键值数组?,hbase,Hbase,我的Hbase表有一列,其中包含键值对数组 我读过关于行键,列族或列,自定义过滤器的内容 我需要扫描列,其中持有特定的键名,如 ROW1 , CF1, DATA_COLUMN : {KEY1:VALUE, KEY2:VALUE, KEY3:VALUE } ROW2 , CF1, DATA_COLUMN : {KEY1:VALUE} ROW3 , CF1, DATA_COLUMN : {KEY1:VALUE, KEY5:VALUE} ROW4 , CF1, DATA_COLUMN : {KEY8:

我的Hbase表有一列,其中包含键值对数组

我读过关于
行键
列族
自定义过滤器
的内容

我需要扫描列,其中持有特定的键名,如

ROW1 , CF1, DATA_COLUMN : {KEY1:VALUE, KEY2:VALUE, KEY3:VALUE }
ROW2 , CF1, DATA_COLUMN : {KEY1:VALUE}
ROW3 , CF1, DATA_COLUMN : {KEY1:VALUE, KEY5:VALUE}
ROW4 , CF1, DATA_COLUMN : {KEY8:VALUE} <--- Only needed row with KEY8 value set
ROW1,CF1,DATA_列:{KEY1:VALUE,KEY2:VALUE,KEY3:VALUE}
第2行,CF1,数据_列:{KEY1:VALUE}
第3行,CF1,DATA_列:{KEY1:VALUE,KEY5:VALUE}

ROW4,CF1,DATA_列:{KEY8:VALUE}您可以使用RowPrefixFilter

为此,您可以使用HBase库来使用扫描对象

this.configuration = HBaseConfiguration.create();
this.connection = ConnectionFactory.createConnection(this.configuration);


String columnFamily = "CF1";
String columnName = "name";
String pattern = "KEY8";

Table table = this.connection.getTable(TableName.valueOf("myTable"));
Scan scan = new Scan();
scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));
scan.setRowPrefixFilter(Bytes.toBytes(pattern));
ResultScanner rs = table.getScanner(scan);
try {
    for (Result r = rs.next(); r != null; r = rs.next()) {
        byte[] value = r.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));
        String valueStr = Bytes.toString(value);
        System.out.println("row key "+new String(r.getRow()));
        System.out.println("Scan result :" + valueStr);
        }
    } finally {
        rs.close(); // always close the ResultScanner!
    }

这将返回键为8的行的值。您可以使用RowPrefixFilter

为此,您可以使用HBase库来使用扫描对象

this.configuration = HBaseConfiguration.create();
this.connection = ConnectionFactory.createConnection(this.configuration);


String columnFamily = "CF1";
String columnName = "name";
String pattern = "KEY8";

Table table = this.connection.getTable(TableName.valueOf("myTable"));
Scan scan = new Scan();
scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));
scan.setRowPrefixFilter(Bytes.toBytes(pattern));
ResultScanner rs = table.getScanner(scan);
try {
    for (Result r = rs.next(); r != null; r = rs.next()) {
        byte[] value = r.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));
        String valueStr = Bytes.toString(value);
        System.out.println("row key "+new String(r.getRow()));
        System.out.println("Scan result :" + valueStr);
        }
    } finally {
        rs.close(); // always close the ResultScanner!
    }

这将返回键为8的行的值使用
SingleColumnValueFilter
SubstringComparator

    SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
            Bytes.toBytes("CF1"),
            Bytes.toBytes("DATA_COLUMN"),
            CompareFilter.CompareOp.EQUAL,
            new SubstringComparator("KEY8")
    );
    Scan scan = new Scan();
    scan.setFilter(singleColumnValueFilter);
    ResultScanner resultScanner = table.getScanner(scan);

如果需要更精确地执行此操作(例如,如果示例中的
值包含
键8
,则会出现意外结果),则需要自己构建自定义筛选器。

使用
单列值筛选器
子字符串比较器

    SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
            Bytes.toBytes("CF1"),
            Bytes.toBytes("DATA_COLUMN"),
            CompareFilter.CompareOp.EQUAL,
            new SubstringComparator("KEY8")
    );
    Scan scan = new Scan();
    scan.setFilter(singleColumnValueFilter);
    ResultScanner resultScanner = table.getScanner(scan);

如果需要更精确地执行此操作(例如,如果示例中的
值包含
KEY8
,则会出现意外结果),则需要自己构建自定义筛选器。

列名不是
KEYn
,而是
数据。我已经编辑了我的问题。很抱歉打扰您。您想要所有以键8开头的行吗?我已编辑了答案,以便您可以轻松获得以键8开头的所有行。列名不是
KEYn
,而是
DATA
。我已经编辑了我的问题。很抱歉打扰您。您想要所有以键8开头的行吗?我编辑了我的答案,以便您可以轻松获得所有以键8开头的行,因此您的值是json样式的字符串,您只想查找值包含“键8”的行?因此您的值是json样式的字符串,您只想查找值包含“键8”的行?