java—通过hbase get只读取一行中的最新值

lf3rwulv  于 2021-06-09  发布在  Hbase
关注(0)|答案(2)|浏览(728)

根据这些数据:

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

hbase get返回x和y。我通常希望它只返回y(因为这是最新的时间戳)。但事实并非如此。
有几种方法可以解决这个问题。
使用get.setmaxversions(1)。但是,这不起作用。
使用get.settimestamp(长时间戳)。然而,这也不是一个好主意。
禁用表的版本控制。如果没有更好的解决办法,这就是我要做的。
我希望我错过了一个简单的解决方案。

pxq42qpu

pxq42qpu1#

我认为版本控制在这里被误解了。尽管版本(元数据)是在columnfamily级别维护的,但是版本是在单元格级别维护的。所以在您的示例中,cf1:c1只有一个版本,所以在您的扫描过程中,显然这将是最新版本的单元格。
如需详细说明,请参阅下面随附的屏幕截图。

如您所述,我们为cf1:c1和cf1:c2各提供一个单元格。
接下来我们将在cf1:c1中插入另一条记录,因此这将创建另一个单元格,并且它具有最新版本的时间戳。
因此,如果您在表中扫描多个版本,您可以看到cf1:c1包含两个版本不同的单元格
如果您在扫描期间只获得最新版本,那么您将获得“z”作为值,因为它具有cf1:c1的最新版本单元格
我通过阅读文件中的hbase版本了解到,也许它也能帮助您。

aurhwmvo

aurhwmvo2#

使用hbase提供的“dependentcolumnfilter”可以解决此问题。dependentcolumnfilter帮助仅读取具有最新时间戳的列。因此,将获取所有只有最新时间戳的列。
如果只是扫描hbase shell上的hbase表,仍然会看到“null”列有一个值,但时间戳将是旧的。
ps:此筛选器必须应用于不总是为空的列(根据您的业务)。

相关问题