我有一个包含宽列模式的表。我随着时间的推移将数据保存到行中,架构将有效地更改。在时间= t1,我可能有列a,b,c,在时间= t2我可能有a,b和d。
每当我从表中获取时,我只想要具有整个行的最新时间戳的单元格。所以在t2,我会用c列排除单元格。
如果我将maxversions设置为1,我可以获得该行中每个单元格的最新值,但我不想这样做。相反,我只想要上次交易中的单元格。
为了加快从事务到事务的列之间的速度,我想过滤服务器端。我曾计划使用DependentColumnFilter和一个名为ts的列。我想过滤单元格,使它们的时间戳与列ts的时间戳匹配 - 是否可以不过滤客户端?
答案 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是一个例子,如果你想查看它。