我正在尝试执行一个HBase客户端Put操作,计算的时间戳相当于年份“Thu Sep 21 12:50:34 EDT 1950”,这是一个负值。
使用案例:设置过去的创建日期以对值执行预期的TTL
参考:How to set a future insert date in Google Cloud Bigtable? Trying to calculate it using TTL
错误:
Caused by: java.lang.IllegalArgumentException: Timestamp cannot be negative. ts=-608368165717
码:
long now = System.currentTimeMillis();
long colFam_TTL = cfDescriptor1.getTimeToLive() * 1000; // TTL: Forever => 2147483647 Seconds
long expiry_past = now - colFam_TTL;
long creationTime = (expiry_past + 3600000); // Expected TTL : 1 hour(3600000 ms)
Put p = new Put(rowkey, creationTime);
对于TTL设置为maxage的列族,计算效果很好:1h或maxage:5d
这有解决方法吗?我怎样才能设置类似的ts?
我不太清楚你想要完成什么,但正如另一位评论者所指出的那样,问题是时间戳Cloud Bigtable时间戳必须是非负的。
在这种情况下,问题在于,如您所知,写入时您的creationTime具有负值,并且时间戳值必须是正值,从Unix时期解释为任何基于时间的GC表达式的毫秒。
看起来你真正想要的是计算colFam_TTL - 现在,而不是相反,并将其钳制为0。