过滤器

更新时间:
复制为 MD 格式

表格存储支持在服务端按条件筛选数据,减少返回客户端的数据量,降低网络传输开销。

使用方式

过滤器在服务端读取数据后执行筛选,只将符合条件的行返回给客户端。由于筛选发生在数据读取之后,过滤器不影响实际读取的行数,但可以减少网络传输的数据量。

通过查询请求的 setFilter 方法设置过滤器实例。表格存储提供以下三种过滤器:

  • SingleColumnValueFilter:单属性列值过滤器。判断单个属性列的值是否符合条件。

  • SingleColumnValueRegexFilter:单属性列正则过滤器。将 String 类型的属性列按照指定的正则表达式匹配子字符串后转换成指定的数据类型,再判断是否符合条件。

  • CompositeColumnValueFilter:组合过滤器。将多个条件组合进行数据过滤。

单属性列值过滤器

public class SingleColumnValueFilter extends ColumnValueFilter

调用签名new SingleColumnValueFilter(columnName, operator, columnValue)

点击查看参数说明

名称

类型

说明

operator(必选)

CompareOperator

关系运算符,包括 EQUAL(等于)、NOT_EQUAL(不等于)、GREATER_THAN(大于)、GREATER_EQUAL(大于等于)、LESS_THAN(小于)、LESS_EQUAL(小于等于)。

columnName(必选)

String

待判断的属性列名称。

columnValue(必选)

ColumnValue

比较判断的值。

passIfMissing

boolean

行数据不包含判断的属性列时,是否返回该行。默认值为 true,即返回该行数据。设置为 false 时,不包含该属性列的行不会返回。

latestVersionsOnly

boolean

是否只判断最新的数据版本。默认值为 true,即当属性列存在多个数据版本时,只判断最新版本是否符合条件。设置为 false 时,任意版本符合条件即返回该行。

单属性列正则过滤器

只有 String 类型的属性列支持使用正则过滤器。

public class SingleColumnValueRegexFilter extends ColumnValueFilter

调用签名new SingleColumnValueRegexFilter(columnName, regexRule, operator, columnValue)

参数说明

名称

类型

说明

operator(必选)

CompareOperator

关系运算符,包括 EQUAL(等于)、NOT_EQUAL(不等于)、GREATER_THAN(大于)、GREATER_EQUAL(大于等于)、LESS_THAN(小于)、LESS_EQUAL(小于等于)。

columnName(必选)

String

待判断的属性列名称。

columnValue(必选)

ColumnValue

比较判断的值。

regexRule(必选)

OptionalValue<RegexRule>

正则匹配规则,包含以下参数。

  • regex:正则表达式,用于匹配子字符串,长度不能超过 256 个字节。

    • 支持 Perl 正则表达式和单字节正则表达式。

    • 不支持中文正则匹配。

    • 支持分组语法,当正则表达式中包含分组时,将返回第一个匹配的子字符串。例如待匹配列值为 1aaa51bbb5,正则表达式为 1([a-z]+)5,返回结果为 aaa

  • castType:子字符串转换的类型,包括 VT_INTEGER(整型)、VT_DOUBLE(双精度浮点型) 和 VT_STRING(字符串)。

组合过滤器

最多支持 32 个条件的组合。

public class CompositeColumnValueFilter extends ColumnValueFilter

调用签名new CompositeColumnValueFilter(logicOperator),再通过 addFilter() 添加各过滤条件。

参数说明

名称

类型

说明

type(必选)

LogicOperator

逻辑运算符,包括 NOT(非)、AND(与)、OR(或)。

filters(必选)

List<ColumnValueFilter>

参与逻辑运算的过滤器,包括单属性列值过滤器单属性列正则过滤器,也可以是组合过滤器本身。

示例代码

运行代码前,先在环境变量中配置访问凭证 TABLESTORE_ACCESS_KEY_IDTABLESTORE_ACCESS_KEY_SECRET

以下三个示例均以范围查询为基础:构造主键范围为 [row1, row3)RangeRowQueryCriteria,通过 setFilter 附加不同类型的过滤器后,调用 getRange 执行查询。

单属性列值过滤器

以下示例执行范围查询,只返回 col1 属性列值等于 val1 的行数据。

import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.V4Credentials;
import com.alicloud.openservices.tablestore.model.Column;
import com.alicloud.openservices.tablestore.model.ColumnValue;
import com.alicloud.openservices.tablestore.model.GetRangeRequest;
import com.alicloud.openservices.tablestore.model.GetRangeResponse;
import com.alicloud.openservices.tablestore.model.PrimaryKeyBuilder;
import com.alicloud.openservices.tablestore.model.PrimaryKeyValue;
import com.alicloud.openservices.tablestore.model.RangeRowQueryCriteria;
import com.alicloud.openservices.tablestore.model.Row;
import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueFilter;

public class SingleValueFilter {

    public static void main(String[] args) {

        // 从环境变量中获取访问凭证(需要配置TABLESTORE_ACCESS_KEY_ID和TABLESTORE_ACCESS_KEY_SECRET)
        final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
        final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");

        // TODO: 根据实例信息修改以下配置
        final String region = "cn-hangzhou"; // 填写实例所属的地域ID,例如 "cn-hangzhou"
        final String instanceName = "your_instance_name"; // 填写实例名称
        final String endpoint = "your_endpoint"; // 填写实例访问地址

        SyncClient client = null;
        try {
            // 构造凭证
            DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
            V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
            CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);

            // 创建客户端实例
            client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

            // 构造查询条件
            // TODO: 修改表名称
            RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("test_table");
            // 设置查询起始主键
            // TODO: 修改主键名和值
            PrimaryKeyBuilder startKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            startKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startKeyBuilder.build());
            // 设置查询结束主键,返回结果不包含结束主键
            // TODO: 修改主键名和值
            PrimaryKeyBuilder endKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            endKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row3"));
            rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endKeyBuilder.build());
            // 设置版本数为 1;latestVersionsOnly 默认为 true,过滤器只判断最新版本
            rangeRowQueryCriteria.setMaxVersions(1);

            // 构造过滤器,条件为 col1 == "val1"
            // TODO: 修改过滤字段和值
            SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("col1", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromString("val1"));
            rangeRowQueryCriteria.setFilter(singleColumnValueFilter);

            // 调用getRange方法查询数据
            GetRangeRequest getRangeRequest = new GetRangeRequest(rangeRowQueryCriteria);
            GetRangeResponse getRangeResponse = client.getRange(getRangeRequest);

            // 返回结果处理
            System.out.println("查询完成,结果统计:");
            System.out.println("RequestId: " + getRangeResponse.getRequestId());
            System.out.println("Read CU Cost: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
            System.out.println("Write CU Cost: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
            
            // 输出查询结果
            if (getRangeResponse.getRows() != null && !getRangeResponse.getRows().isEmpty()) {
                System.out.println("共找到 " + getRangeResponse.getRows().size() + " 行符合条件的数据:");
                for (Row row : getRangeResponse.getRows()) {
                    // 获取并打印主键信息
                    // TODO: 根据主键数据类型进行修改
                    String primaryKeyInfo = row.getPrimaryKey().toString();
                    System.out.println("- 主键: " + primaryKeyInfo);

                    // 遍历并打印该行的所有属性列 (当MaxVersions=1时,每个Column即为最新版本)
                    if (row.getColumns() != null && row.getColumns().length > 0) {
                        System.out.println("  属性列:");
                        for (Column column : row.getColumns()) {
                            // 打印列的名称、值和时间戳
                            String columnName = column.getName();
                            // TODO: 根据属性列数据类型进行修改
                            String columnValue = column.getValue().toString();
                            long timestamp = column.getTimestamp();
                            System.out.println(
                                    String.format("    - %s: %s (版本时间戳: %d)", columnName, columnValue, timestamp)
                            );
                        }
                    } else {
                        System.out.println("  (该行没有属性列)");
                    }
                }
            } else {
                System.out.println("没有找到符合过滤条件的数据");
            }
            
            System.out.println("过滤查询操作执行完成");

        } catch (Exception e) {
            System.err.println("查询失败,详细信息如下:");
            e.printStackTrace();
        } finally {
            // 关闭客户端
            if (client != null) {
                client.shutdown();
            }
        }
    }
}

单属性列正则过滤器

以下示例在主键范围 [row1, row3) 内执行范围查询,使用正则表达式 1([a-z]+)5 匹配 col1 属性列,只返回提取的子字符串等于 aaa 的行数据。

import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.V4Credentials;
import com.alicloud.openservices.tablestore.model.Column;
import com.alicloud.openservices.tablestore.model.ColumnValue;
import com.alicloud.openservices.tablestore.model.GetRangeRequest;
import com.alicloud.openservices.tablestore.model.GetRangeResponse;
import com.alicloud.openservices.tablestore.model.PrimaryKeyBuilder;
import com.alicloud.openservices.tablestore.model.PrimaryKeyValue;
import com.alicloud.openservices.tablestore.model.RangeRowQueryCriteria;
import com.alicloud.openservices.tablestore.model.Row;
import com.alicloud.openservices.tablestore.model.filter.RegexRule;
import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueRegexFilter;

public class SingleValueRegexFilter {

    public static void main(String[] args) {

        // 从环境变量中获取访问凭证(需要配置TABLESTORE_ACCESS_KEY_ID和TABLESTORE_ACCESS_KEY_SECRET)
        final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
        final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");

        // TODO: 根据实例信息修改以下配置
        final String region = "cn-hangzhou"; // 填写实例所属的地域ID,例如 "cn-hangzhou"
        final String instanceName = "your_instance_name"; // 填写实例名称
        final String endpoint = "your_endpoint"; // 填写实例访问地址

        SyncClient client = null;
        try {
            // 构造凭证
            DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
            V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
            CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);

            // 创建客户端实例
            client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

            // 构造查询条件
            // TODO: 修改表名称
            RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("test_table");
            // 设置查询起始主键
            // TODO: 修改主键名和值
            PrimaryKeyBuilder startKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            startKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startKeyBuilder.build());
            // 设置查询结束主键,返回结果不包含结束主键
            // TODO: 修改主键名和值
            PrimaryKeyBuilder endKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            endKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row3"));
            rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endKeyBuilder.build());
            // 设置查询版本
            rangeRowQueryCriteria.setMaxVersions(1);

            // 构造正则过滤器,条件为 cast<String>(reg(col1)) == "aaa"
            // RegexRule:正则表达式 "1([a-z]+)5" 提取列值中的第一个捕获分组
            //   例如列值为 "1aaa51bbb5",提取结果为 "aaa"(正则第一个分组匹配到的内容)
            // castType 为 VT_STRING:将提取的子字符串作为字符串类型进行比较
            // TODO: 修改正则表达式、过滤字段和匹配值
            RegexRule regexRule = new RegexRule("1([a-z]+)5", RegexRule.CastType.VT_STRING);
            SingleColumnValueRegexFilter singleColumnValueRegexFilter = new SingleColumnValueRegexFilter("col1", regexRule, SingleColumnValueRegexFilter.CompareOperator.EQUAL, ColumnValue.fromString("aaa"));
            rangeRowQueryCriteria.setFilter(singleColumnValueRegexFilter);

            // 调用getRange方法查询行数据
            GetRangeRequest getRangeRequest = new GetRangeRequest(rangeRowQueryCriteria);
            GetRangeResponse getRangeResponse = client.getRange(getRangeRequest);

            // 返回结果处理
            System.out.println("正则过滤查询完成,结果统计:");
            System.out.println("RequestId: " + getRangeResponse.getRequestId());
            System.out.println("Read CU Cost: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
            System.out.println("Write CU Cost: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
            
            // 输出查询结果
            if (getRangeResponse.getRows() != null && !getRangeResponse.getRows().isEmpty()) {
                System.out.println("共找到 " + getRangeResponse.getRows().size() + " 行符合正则过滤条件的数据:");
                for (Row row : getRangeResponse.getRows()) {
                    // 获取并打印主键信息
                    // TODO: 根据主键数据类型进行修改
                    String primaryKeyInfo = row.getPrimaryKey().toString();
                    System.out.println("- 主键: " + primaryKeyInfo);

                    // 遍历并打印该行的所有属性列 (当MaxVersions=1时,每个Column即为最新版本)
                    if (row.getColumns() != null && row.getColumns().length > 0) {
                        System.out.println("  属性列:");
                        for (Column column : row.getColumns()) {
                            // 打印列的名称、值和时间戳
                            String columnName = column.getName();
                            // TODO: 根据属性列数据类型进行修改
                            String columnValue = column.getValue().toString();
                            long timestamp = column.getTimestamp();
                            System.out.println(
                                    String.format("    - %s: %s (版本时间戳: %d)", columnName, columnValue, timestamp)
                            );
                        }
                    } else {
                        System.out.println("  (该行没有属性列)");
                    }
                }
            } else {
                System.out.println("没有找到符合正则过滤条件的数据");
            }
            
            System.out.println("正则过滤查询操作执行完成");

        } catch (Exception e) {
            System.err.println("正则过滤查询失败,详细信息如下:");
            e.printStackTrace();
        } finally {
            // 关闭客户端
            if (client != null) {
                client.shutdown();
            }
        }
    }
}

组合过滤器

以下示例在主键范围 [row1, row3) 内执行范围查询,只返回满足条件 (col1 == "val1" OR cast<String>(reg(col2)) >= "aaa") AND col3 == "val3" 的行数据。

import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.V4Credentials;
import com.alicloud.openservices.tablestore.model.Column;
import com.alicloud.openservices.tablestore.model.ColumnValue;
import com.alicloud.openservices.tablestore.model.GetRangeRequest;
import com.alicloud.openservices.tablestore.model.GetRangeResponse;
import com.alicloud.openservices.tablestore.model.PrimaryKeyBuilder;
import com.alicloud.openservices.tablestore.model.PrimaryKeyValue;
import com.alicloud.openservices.tablestore.model.RangeRowQueryCriteria;
import com.alicloud.openservices.tablestore.model.Row;
import com.alicloud.openservices.tablestore.model.filter.CompositeColumnValueFilter;
import com.alicloud.openservices.tablestore.model.filter.RegexRule;
import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueFilter;
import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueRegexFilter;

public class CompositeFilter {

    public static void main(String[] args) {

        // 从环境变量中获取访问凭证(需要配置TABLESTORE_ACCESS_KEY_ID和TABLESTORE_ACCESS_KEY_SECRET)
        final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
        final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");

        // TODO: 根据实例信息修改以下配置
        final String region = "cn-hangzhou"; // 填写实例所属的地域ID,例如 "cn-hangzhou"
        final String instanceName = "your_instance_name"; // 填写实例名称
        final String endpoint = "your_endpoint"; // 填写实例访问地址

        SyncClient client = null;
        try {
            // 构造凭证
            DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
            V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
            CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);

            // 创建客户端实例
            client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));

            // 构造查询条件
            // TODO: 修改表名称
            RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("test_table");
            // 设置查询起始主键
            // TODO: 修改主键名和值
            PrimaryKeyBuilder startKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            startKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startKeyBuilder.build());
            // 设置查询结束主键,返回结果不包含结束主键
            // TODO: 修改主键名和值
            PrimaryKeyBuilder endKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            endKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row3"));
            rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endKeyBuilder.build());
            // 设置查询版本
            rangeRowQueryCriteria.setMaxVersions(1);

            // 1. 构造叶子过滤器:col1 == "val1"
            // TODO: 修改过滤字段和值
            SingleColumnValueFilter singleColumnValueFilter1 = new SingleColumnValueFilter("col1", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromString("val1"));
            
            // 2. 构造叶子过滤器:cast<String>(reg(col2)) >= "aaa"
            //    正则 "1([a-z]+)5" 提取第一个捕获分组后,以字符串形式与 "aaa" 比较
            // TODO: 修改正则表达式、字段名和比较值
            RegexRule regexRule = new RegexRule("1([a-z]+)5", RegexRule.CastType.VT_STRING);
            SingleColumnValueRegexFilter singleColumnValueRegexFilter = new SingleColumnValueRegexFilter("col2", regexRule, SingleColumnValueRegexFilter.CompareOperator.GREATER_EQUAL, ColumnValue.fromString("aaa"));
            
            // 3. 用 OR 组合过滤器1和2:col1 == "val1" OR cast<String>(reg(col2)) >= "aaa"
            CompositeColumnValueFilter compositeColumnValueFilter1 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.OR);
            compositeColumnValueFilter1.addFilter(singleColumnValueFilter1);
            compositeColumnValueFilter1.addFilter(singleColumnValueRegexFilter);
            
            // 4. 构造叶子过滤器:col3 == "val3"
            // TODO: 修改过滤字段和值
            SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter("col3", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromString("val3"));
            
            // 5. 用 AND 组合 OR 分组与过滤器4:
            //    (col1 == "val1" OR cast<String>(reg(col2)) >= "aaa") AND col3 == "val3"
            CompositeColumnValueFilter compositeColumnValueFilter2 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.AND);
            compositeColumnValueFilter2.addFilter(compositeColumnValueFilter1);
            compositeColumnValueFilter2.addFilter(singleColumnValueFilter2);
            
            // 将顶层组合过滤器附加到查询条件
            rangeRowQueryCriteria.setFilter(compositeColumnValueFilter2);

            // 调用getRange方法查询数据
            GetRangeRequest getRangeRequest = new GetRangeRequest(rangeRowQueryCriteria);
            GetRangeResponse getRangeResponse = client.getRange(getRangeRequest);

            // 返回结果处理
            System.out.println("查询完成,结果统计:");
            System.out.println("RequestId: " + getRangeResponse.getRequestId());
            System.out.println("Read CU Cost: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
            System.out.println("Write CU Cost: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
            
            // 输出查询结果
            if (getRangeResponse.getRows() != null && !getRangeResponse.getRows().isEmpty()) {
                System.out.println("共找到 " + getRangeResponse.getRows().size() + " 行符合条件的数据:");
                for (Row row : getRangeResponse.getRows()) {
                    // 获取并打印主键信息
                    // TODO: 根据主键数据类型进行修改
                    String primaryKeyInfo = row.getPrimaryKey().toString();
                    System.out.println("- 主键: " + primaryKeyInfo);

                    // 遍历并打印该行的所有属性列 (当MaxVersions=1时,每个Column即为最新版本)
                    if (row.getColumns() != null && row.getColumns().length > 0) {
                        System.out.println("  属性列:");
                        for (Column column : row.getColumns()) {
                            // 打印列的名称、值和时间戳
                            String columnName = column.getName();
                            // TODO: 根据属性列数据类型进行修改
                            String columnValue = column.getValue().toString();
                            long timestamp = column.getTimestamp();
                            System.out.println(
                                    String.format("    - %s: %s (版本时间戳: %d)", columnName, columnValue, timestamp)
                            );
                        }
                    } else {
                        System.out.println("  (该行没有属性列)");
                    }
                }
            } else {
                System.out.println("没有找到符合过滤条件的数据");
            }
            
            System.out.println("组合过滤查询操作执行完成");

        } catch (Exception e) {
            System.err.println("查询失败,详细信息如下:");
            e.printStackTrace();
        } finally {
            // 关闭客户端
            if (client != null) {
                client.shutdown();
            }
        }
    }
}

列不存在时的过滤行为

通过 setPassIfMissing 方法控制行数据不包含判断属性列时的返回行为。

// 行数据不包含判断的属性列时,不返回该行
singleColumnValueFilter.setPassIfMissing(false);

过滤历史版本数据

通过 setLatestVersionsOnly 方法控制判断的数据版本范围。设置为 false 后,只要有任意版本的数据符合条件,即返回该行。

// 判断所有版本的数据
singleColumnValueFilter.setLatestVersionsOnly(false);

相关文档

读取数据