在shell中的特定时间戳之后仅列出hbase中的行键

时间:2017-10-24 11:05:23

标签: hadoop hbase

如何在shell中的特定时间戳之后仅列出hbase中的行键(不是值或时间戳)。

1 个答案:

答案 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'))
    }