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是一个例子,如果你想看看的话。
我有一个具有宽列架构的 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是一个例子,如果你想看看的话。