通过HBase连续只读取最新值

时间:2018-05-31 20:26:19

标签: java hbase

鉴于此数据:

row_key          cf1:c1           cf1:c2           timestamp
    ------------------------------------------------------------
    1              x                            t1
    1                               y           t2

HBase get同时返回x和y。我通常希望它只返回y(因为这是最新的时间戳)。但事实并非如此。

有几种方法可以解决这个问题。

  1. 使用get.setMaxVersions(1)。但是,this doesn't work
  2. 使用get.setTimestamp(长时间戳)。但是,this is not a good idea either
  3. 禁用表格版本控制。如果没有更好的解决方案,我就会这样做。
  4. 我希望我只是错过了一个简单易用的解决方案。

2 个答案:

答案 0 :(得分:0)

我认为这里的版本控制被误解了。虽然版本(元数据)维护在ColumnFamily级别,但版本仍保持在单元级别。因此在您的示例中,cf1:c1只有一个版本,所以在扫描期间,显然这将是最新版本的单元格。

详细说明,请参阅下面的截图。

enter image description here

  1. 我们为cf1提供了一个单元格:c1和cf1:c2,由您解释。
  2. 接下来我们在cf1:c1中插入另一条记录,这样就会创建另一个单元格并且它具有最新版本的时间戳。
  3. 因此,如果您扫描表格的多个版本,您可以看到cf1:c1包含两个不同版本的单元格
  4. 如果您在扫描期间只获得最新版本,那么您将获得" z"作为具有cf1的最新版本单元格的值:c1
  5. 我通过HBase version in document了解,也可能对你有所帮助。

答案 1 :(得分:0)

可以使用HBase提供的'DependentColumnFilter'解决此问题。 DependentColumnFilter帮助仅读取具有最新时间戳的列。 因此,将仅获取具有最新时间戳的所有列。

如果仅扫描hbase shell上的hbase表,仍然会看到“ null”列具有值,但是时间戳记会很旧。

PS:此过滤器必须应用于不会总是为空的列(根据您的业务)。