HBase - 获取单元格,使得时间戳在行中是最新的而不过滤客户端

HBase - get cells such that the timestamp is the latest in the row without filtering client side

我有一个具有宽列架构的 table。随着时间的推移,我将数据保存到行中,模式将有效地改变。在 time=t1 时,我可能有 a、b、c 列,在 time=t2 时我可能有 a、b 和 d。

每当我从 table 获取时,我只想要整行具有最新时间戳的单元格。所以在 t2,我会排除 c 列的单元格。

如果我将 maxversions 设置为 1,我可以获得行中每个单元格的最新值,但我不想这样。相反,我只想要上次交易的单元格。

为了在事务与事务之间的列存在很大差异时加快处理速度,我想在服务器端进行过滤。我曾计划使用 DependentColumnFilter 和一个名为 ts 的列。我想过滤单元格,使它们的时间戳与列 ts 的时间戳相匹配——这是否可能不过滤客户端?

自定义过滤器可以完成这项工作:

public class GetLatestColumnsFilter extends TimestampsFilter {
    private static final Log log = LogFactory.getLog(GetLatestColumnsFilter.class);
    private long max;

    public GetLatestColumnsFilter() {
        super(new ArrayList<>());
        max = -1;
    }

    @Override
    public ReturnCode filterKeyValue(Cell v) {
        if (-1 == max) {
            max = Long.valueOf(v.getTimestamp());
        } else if (max != Long.valueOf(v.getTimestamp())) {
            return ReturnCode.SKIP;
        }
        return ReturnCode.INCLUDE;
    }

    public static GetLatestColumnsFilter parseFrom(byte[] pbBytes) throws DeserializationException {
        return new GetLatestColumnsFilter();
    }

}

There是一个例子,如果你想看看的话。