如何在shell中的特定时间戳之后仅列出hbase中的行键(不是值或时间戳)。
答案 0 :(得分:3)
时间戳绑定到列而不是行。因此,如果按时间戳过滤,则只会返回该行的某些列。
如果你有一个表t1:
ROW COLUMN+CELL
ID1 column=d:actif, timestamp=25, value=false
ID1 column=d:name, timestamp=22, value="Sudipto"
ID1 column=m:lastMaj, timestamp=25, value=25
ID2 column=d:actif, timestamp=24, value=false
ID2 column=m:lastMaj, timestamp=24, value=24
您可以使用以下内容过滤时间戳:
scan 't1', { TIMERANGE => [0, 25] }
但你只会回来:
ROW COLUMN+CELL
ID1 column=d:actif, timestamp=26, value=false
ID1 column=m:lastMaj, timestamp=26, value=26
ID2 column=d:actif, timestamp=24, value=false
ID2 column=m:lastMaj, timestamp=24, value=24
所以你失去了专栏:
ROW COLUMN+CELL
ID1 column=d:name, timestamp=22, value="Sudipto"
然而,如果您想要所有列,都有一个解决方案。您可以按元数据过滤(此处为m:lastMaj)。每当修改行的列时,都必须更新此lastMaj数据。
在这里,当我修改了" d:actif"时,我也修改了" m:lastMaj" (他们都有25的时间戳)
当我想获取特定时间戳之后的所有行时,我只会过滤" m:lastMaj时间戳"上的行。
在shell中按值扫描的命令可以是:
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
import org.apache.hadoop.hbase.filter.SubstringComparator
import org.apache.hadoop.hbase.util.Bytes
scan 't', { FILTER =>
SingleColumnValueFilter.new(
Bytes.toBytes('m'),
Bytes.toBytes('lastMaj'),
CompareFilter::CompareOp.valueOf('GREATER'),
Bytes.toBytes('25'))
}