【问题标题】:How to get specific rows in Hbase?如何获取 Hbase 中的特定行?
【发布时间】:2019-02-19 13:21:09
【问题描述】:

我在 HBase 中的 rowKeys 是这样的;

a1s1
a1s2
a1s3
a2s1
a3s1
a3s2
...

我只想获取这些数据;

a1s1
a2s1
a3s1

但是当我运行这个查询时; 扫描 't1', {STARTROW=>'a1s1', ENDROW=>'a4s1'}

它给了我;

a1s1
a1s2
a1s3
a2s1
a3s1

但我不想得到 a1s2 和 a1s3。我该怎么做?

【问题讨论】:

    标签: hadoop nosql hbase


    【解决方案1】:

    您应该使用 STARTROW-ENDROW 和另一个带有 RegexStringComparator 的过滤器。如果您仅使用起始行过滤器,hbase 会为您的行键中的每个字符执行此过滤。因为 rowkey 不是数字。在 Hbase shell 你可以试试这个:

    import org.apache.hadoop.hbase.filter.CompareFilter
    
    import org.apache.hadoop.hbase.filter.RegexStringComparator
    
    scan 't1', {STARTROW => 'a1s1', ENDROW => 'a4s1', FILTER => org.apache.hadoop.hbase.filter.RowFilter.new(CompareFilter::CompareOp.valueOf('EQUAL'),RegexStringComparator.new("s1$"))}
    

    【讨论】:

    • 这个方案中,Hbase不做全表扫描吗?
    • 不,它没有。它在开始-结束行键之间扫描。例如,我尝试在 hbase shell 中使用 start-end rowkey 而没有它。使用 start-end rowkey 需要 0.0950 秒,没有它需要 41.3580 秒。所以我们可以说如果你用start-end rowkey进行过滤,扫描操作不会进行全扫描。
    【解决方案2】:

    我假设,您想要获取以“a*”开头并以“s1”结尾的行键。

    所以你可以在下面使用:

     scan 't1', { ENDROW=>'s1'}
    

    或者

    scan 't1', {STARTROW=>'a', ENDROW=>'s1'}
    

    另一种选择是使用正则表达式:

    scan 't1', {FILTER => "RowFilter(=, 'regexstring:*s1')"}
    

    【讨论】:

    • 您遇到了什么错误?您也可以尝试使用 RowFilter
    • 这里的前两个解决方案不起作用,因为STARTROWENDROW用于定义扫描中第一行和最后一行的前缀,而不是定义扫描的开始/结束位置特定行。
    • 那么,我可以将 PrefixFilter 与 Start 和 EndRow 一起使用吗?
    • 如果STARTROW == ENDROW,似乎是随机访问。随着它们之间的距离增加,它会变慢。 FILTER 慢慢循环到所有行...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多