根据这些数据:
row_key cf1:c1 cf1:c2 timestamp
------------------------------------------------------------
1 x t1
1 y t2
hbase get返回x和y。我通常希望它只返回y(因为这是最新的时间戳)。但事实并非如此。
有几种方法可以解决这个问题。
使用get.setmaxversions(1)。但是,这不起作用。
使用get.settimestamp(长时间戳)。然而,这也不是一个好主意。
禁用表的版本控制。如果没有更好的解决办法,这就是我要做的。
我希望我错过了一个简单的解决方案。
2条答案
按热度按时间pxq42qpu1#
我认为版本控制在这里被误解了。尽管版本(元数据)是在columnfamily级别维护的,但是版本是在单元格级别维护的。所以在您的示例中,cf1:c1只有一个版本,所以在您的扫描过程中,显然这将是最新版本的单元格。
如需详细说明,请参阅下面随附的屏幕截图。
如您所述,我们为cf1:c1和cf1:c2各提供一个单元格。
接下来我们将在cf1:c1中插入另一条记录,因此这将创建另一个单元格,并且它具有最新版本的时间戳。
因此,如果您在表中扫描多个版本,您可以看到cf1:c1包含两个版本不同的单元格
如果您在扫描期间只获得最新版本,那么您将获得“z”作为值,因为它具有cf1:c1的最新版本单元格
我通过阅读文件中的hbase版本了解到,也许它也能帮助您。
aurhwmvo2#
使用hbase提供的“dependentcolumnfilter”可以解决此问题。dependentcolumnfilter帮助仅读取具有最新时间戳的列。因此,将获取所有只有最新时间戳的列。
如果只是扫描hbase shell上的hbase表,仍然会看到“null”列有一个值,但时间戳将是旧的。
ps:此筛选器必须应用于不总是为空的列(根据您的业务)。