HBase设置时间戳

5

我在使用Java API设置行时间戳时遇到了问题。

当我尝试将时间戳值添加到put构造函数(或添加到put.add())中时,没有任何反应,从表中读取行后我得到的是系统提供的时间戳。

public static boolean addRecord(String tableName, String rowKey,
    String family, String qualifier, Object value)
{
    try {
        HTable table = new HTable(conf, tableName);
        Put put = new Put(Bytes.toBytes(rowKey), 12345678l);
        put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier), Bytes.toBytes(value.toString()));
        table.put(put);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

HBase 0.92.1以独立模式运行。
感谢您的帮助!

你能提供更多信息吗?你使用的HBase版本是什么?有并发写入该行吗?可能是版本12345678L被成功存储,但你有系统提供的时间戳比12345678L更新。尝试获取该行的所有版本并检查是否存在12345678L。 - André Staltz
HBase 0.92.1。该行只有一个版本(我已在获取中设置了最大版本号并进行了检查)。 - user898722
你能否将“hbase> describe 't1'”(HBase Shell)的输出粘贴到你的表t1(无论它叫什么名字)中?这将为我们提供有关你正在尝试写入的列族的信息。可能会出现一些问题,例如列族的生存时间。同时尝试写入一个空行,你应该肯定会得到你想要的时间戳,因为不应该有其他版本。 - André Staltz
{名称 => 'TestTableName', 列族 => [{名称 => 'Family1', 布隆过滤器 => 'NONE', 复制范围 => '0', 版本数 => '3', 压缩 => 'NONE', 最小版本数 => '0', TTL => '2147483647', 块大小 => '65536', 内存中 => 'false', 块缓存 => 'true'}, {名称 => 'Family2', 布隆过滤器 => 'NONE', 复制范围 => '0', 版本数 => '3', 压缩 => 'NONE', 最小版本数 => '0', TTL => '2147483647', 块大小 => '65536', 内存中 => 'false', 块缓存 => 'true'}]} - user898722
1个回答

8

很可能,您的表中已经有一些行的时间戳>12345678l。为了确认这不是问题,可以尝试使用一个非常大的时间戳值,比如Long.MAX_VALUE

如果确实存在这种情况,您可以简单地删除旧版本。然后此条目将显示。


是的,但是如果您使用get(),则将显示具有最大时间戳的版本,除非您使用setMaxVersions()来获取“旧”的(即时间戳较低的)版本。因此,如果已经存在相同的单元格,时间戳> 12345678,则会显示该单元格。 - Hari Menon
你获取的版本的时间戳是什么? - Hari Menon
你是如何“获取”行的呢?是通过Java API还是HBase Shell?在HBase Shell中,您应该指定许多版本,例如“hbase> get 't1', 'r1', {VERSIONS => 100}”。在Java API中,HTable.get(Get)的Result对象有两种方法:getColumnLatest和getColumn。后者是版本列表。 - André Staltz
Raze2dust,我正在获取记录添加时的系统时间。 STALTZ,我正在通过Java API使用结果扫描器。 - user898722
终于找到了!你们都是对的 - 记录被后面的时间戳覆盖了 - 我在 shell 中使用 TIMERANGE 看到了它。为了获得有效的时间戳,我需要将其添加到 Put 构造函数中,还需要在每个 add() 调用中添加。非常感谢! - user898722
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接