HBase (Easy): How to Perform Range Prefix Scan in hbase shell
Solution 1
So it turns out to be very easy. The scan ranges are not inclusive, the logic is start <= key < end. So the answer is
scan 'mytable', {STARTROW => 'abc', ENDROW => 'abd'}
Solution 2
In recent versions of HBase you can now do in the hbase shell:
scan 'mytable', {ROWPREFIXFILTER => 'abc'}
This effectively does this (and also works for binary situations)
scan 'mytable', {STARTROW => 'abc', ENDROW => 'abd'}
This method is a LOT more efficient than the "PrefixFilter" approach because the latter puts all records through the comparison code the is present in this PrefixFilter class.
Solution 3
The accepted solution won't work in all cases (binary keys). In addition, using a PrefixFilter can be slow because it performs a table scan until it reaches the prefix. A more performant solution is to use a STARTROW and a FILTER like so:
scan 'my_table', {STARTROW => 'abc', FILTER => "PrefixFilter('abc')"}
Solution 4
I think what you need is a filter
checkout the answer for following question Scan with filter using HBase shell
more filters are listed in http://hbase.apache.org/book/client.filter.html
David Williams
Updated on January 29, 2020Comments
-
David Williams over 4 years
I am designing an app to run on hbase and want to interactively explore the contents of my cluster. I am in the hbase shell and I want to perform a scan of all keys starting with the chars "abc". Such keys might inlcude "abc4", "abc92", "abc20014" etc... I tried a scan
hbase(main):003:0> scan 'mytable', {STARTROW => 'abc', ENDROW => 'abc'}
But this does not seem to return anything since there is technically no rowkey "abc" only rowkeys starting with "abc"
What I want is something like
hbase(main):003:0> scan 'mytable', {STARTSROWPREFIX => 'abc', ENDROWPREFIX => 'abc'}
I hear HBase can do this quickly and is one of its main selling points. How do I do this in the hbase shell?