自定义时间戳注意事项一
hbase添加数据时使用的时间戳默认使用的是数据添加时的时间,在存储实时数据的时候是很方便,此时数据时间戳可以当做数据本身的一种属性来使用。但是如果处理的是离线数据,数据产生时间和数据存储时间没有任何关系,那时间戳这个重要的属性就被浪费来。
所以,hbase提供了自定义时间戳的方法。即在使用put方法添加数据的时候手动添加时间戳:
public Put add(Cell kv) //cell是keyValue的接口
public KeyValue(final byte[] row, final byte[] family,
final byte[] qualifier, final long timestamp, final byte[] value) {
this(row, family, qualifier, timestamp, Type.Put, value);
}
这里需要注意的是时间戳不能随意指定,最好新的时间戳要大于等于旧的的时间戳(这里说的是最好),原因主要有两个:
- 因为hbase并不会保留最新插入的数据,而是保留时间戳最大的数据,也就是说如果新添加的数据时间戳小于之前的数据,在版本数足够的情况下可能添加成功,如果版本数不足则无法添加成功(如果有建表的时候设置的版本数是3,已经有三个版本,如果新添加的数据时间戳比三个版本都小,那这个数据就不会添加成功)
- 使用api读取数据的时候,并不是按时间戳大小来读取的,是按存入时间读取的,例如,如果有一行数据,新值的时间戳小于旧值的时间戳,使用scan读取数据在不指定maxversion的情况下,默认读取的是最新插入的数据而不是时间戳最小的数据。
总结上面两点就是:时间戳小于旧时间戳有可能插入不成功,如果插入成功使用api读取的就是最新插入的数据。
自定义时间戳注意事项二
hbase的时间戳单位默认是毫秒,但是由于时间戳支持自定义,所以并不能严格说默认单位是毫秒。
&emsp例如笔者做过一个项目,要存入hbase的一批数据的时间戳是秒级的,存入时并没有将时间戳转换为毫秒级就直接存入了,此时时间戳是毫秒级的,但是用却要当做秒来用。所以在我的项目里hbase的时间戳就是秒级,在用api读取数据指定范围时也要按秒来指定时间范围。