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

时间:2016-07-04 19:58:08

标签: hbase

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

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

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

为了加快从事务到事务的列之间的速度,我想过滤服务器端。我曾计划使用DependentColumnFilter和一个名为ts的列。我想过滤单元格,使它们的时间戳与列ts的时间戳匹配 - 是否可以不过滤客户端?

1 个答案:

答案 0 :(得分:1)

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

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是一个例子,如果你想查看它。