View Post
HBase Scan,Get用法
Scan,get用法
1. get help帮助信息
从下列get用法信息可以看出 get 后面可以跟table表名,rowkey,以及column,value.但是如果想通过get直接获取一个表中的全部数据是做不到的,这种情况就要用到另外一个命令scan。
hbase(main):214:0> help \'get\'
Get row or cell contents; pass table name, row, and optionally
a dictionary of column(s), timestamp, timerange and versions. Examples:
hbase> get \'ns1:t1\', \'r1\'
hbase> get \'t1\', \'r1\'
hbase> get \'t1\', \'r1\', {TIMERANGE => [ts1, ts2]}
hbase> get \'t1\', \'r1\', {COLUMN => \'c1\'}
hbase> get \'t1\', \'r1\', {COLUMN => [\'c1\', \'c2\', \'c3\']}
hbase> get \'t1\', \'r1\', {COLUMN => \'c1\', TIMESTAMP => ts1}
hbase> get \'t1\', \'r1\', {COLUMN => \'c1\', TIMERANGE => [ts1, ts2], VERSIONS => 4}
hbase> get \'t1\', \'r1\', {COLUMN => \'c1\', TIMESTAMP => ts1, VERSIONS => 4}
hbase> get \'t1\', \'r1\', {FILTER => "ValueFilter(=, \'binary:abc\')"}
hbase> get \'t1\', \'r1\', \'c1\'
hbase> get \'t1\', \'r1\', \'c1\', \'c2\'
hbase> get \'t1\', \'r1\', [\'c1\', \'c2\']
hbsase> get \'t1\',\'r1\', {COLUMN => \'c1\', ATTRIBUTES => {\'mykey\'=>\'myvalue\'}}
hbsase> get \'t1\',\'r1\', {COLUMN => \'c1\', AUTHORIZATIONS => [\'PRIVATE\',\'SECRET\']}
2. Scan help帮助信息
scan的用法很多,可以直接扫描全表信息也可以通过指定条件来显示我们所需要获取的数据。这里涉及到Filter的用法接下来会逐一演示
hbase(main):221:0> help \'scan\'
Scan a table; pass table name and optionally a dictionary of scanner
specifications. Scanner specifications may include one or more of:
TIMERANGE, FILTER, LIMIT, STARTROW, STOPROW, TIMESTAMP, MAXLENGTH,
or COLUMNS, CACHE
If no columns are specified, all columns will be scanned.
To scan all members of a column family, leave the qualifier empty as in
\'col_family:\'.
The filter can be specified in two ways:
1. Using a filterString - more information on this is available in the
Filter Language document attached to the HBASE-4176 JIRA
2. Using the entire package name of the filter.
Some examples:
hbase> scan \'hbase:meta\'
hbase> scan \'hbase:meta\', {COLUMNS => \'info:regioninfo\'}
hbase> scan \'ns1:t1\', {COLUMNS => [\'c1\', \'c2\'], LIMIT => 10, STARTROW => \'xyz\'}
hbase> scan \'t1\', {COLUMNS => [\'c1\', \'c2\'], LIMIT => 10, STARTROW => \'xyz\'}
hbase> scan \'t1\', {COLUMNS => \'c1\', TIMERANGE => [1303668804, 1303668904]}
hbase> scan \'t1\', {REVERSED => true}
hbase> scan \'t1\', {FILTER => "(PrefixFilter (\'row2\') AND
(QualifierFilter (>=, \'binary:xyz\'))) AND (TimestampsFilter ( 123, 456))"}
hbase> scan \'t1\', {FILTER =>
org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)}
For setting the Operation Attributes
hbase> scan \'t1\', { COLUMNS => [\'c1\', \'c2\'], ATTRIBUTES => {\'mykey\' => \'myvalue\'}}
hbase> scan \'t1\', { COLUMNS => [\'c1\', \'c2\'], AUTHORIZATIONS => [\'PRIVATE\',\'SECRET\']}
For experts, there is an additional option -- CACHE_BLOCKS -- which
switches block caching for the scanner on (true) or off (false). By
default it is enabled. Examples:
hbase> scan \'t1\', {COLUMNS => [\'c1\', \'c2\'], CACHE_BLOCKS => false}
Also for experts, there is an advanced option -- RAW -- which instructs the
scanner to return all cells (including delete markers and uncollected deleted
cells). This option cannot be combined with requesting specific COLUMNS.
Disabled by default. Example:
hbase> scan \'t1\', {RAW => true, VERSIONS => 10}
Besides the default \'toStringBinary\' format, \'scan\' supports custom formatting
by column. A user can define a FORMATTER by adding it to the column name in
the scan specification. The FORMATTER can be stipulated:
1. either as a org.apache.hadoop.hbase.util.Bytes method name (e.g, toInt, toString)
2. or as a custom class followed by method name: e.g. \'c(MyFormatterClass).format\'.
Example formatting cf:qualifier1 and cf:qualifier2 both as Integers:
hbase> scan \'t1\', {COLUMNS => [\'cf:qualifier1:toInt\',
\'cf:qualifier2:c(org.apache.hadoop.hbase.util.Bytes).toInt\'] }
Note that you can specify a FORMATTER by column only (cf:qualifer). You cannot
specify a FORMATTER for all columns of a column family.
Scan can also be used directly from a table, by first getting a reference to a
table, like such:
hbase> t = get_table \'t\'
hbase> t.scan
Note in the above situation, you can still provide all the filtering, columns,
options, etc as described above.
3. 通过get,Scan用法来获取表中指定rowkey信息。
1. get 获取table中rowkey语句 于 Scan获取table中rowkey语句
=================================================================================================================
【get】
hbase(main):011:0> get \'liupeng:employee\',\'1001\'
COLUMN CELL
contect:mail timestamp=1522202414649, value=liupliup@cn.ibm.com
contect:phone timestamp=1522202430196, value=15962459503
group:number timestamp=1522202455929, value=1
info:age timestamp=1522202371257, value=34
info:name timestamp=1522202364156, value=liupeng
【Scan】
hbase(main):010:0> scan \'liupeng:employee\',FILTER=>"PrefixFilter(\'1001\')"
ROW COLUMN+CELL
1001 column=contect:mail, timestamp=1522202414649, value=liupliup@cn.ibm.com
1001 column=contect:phone, timestamp=1522202430196, value=15962459503
1001 column=group:number, timestamp=1522202455929, value=1
1001 column=info:age, timestamp=1522202371257, value=34
1001 column=info:name, timestamp=1522202364156, value=liupeng
1 row(s) in 0.0590 seconds
总结:从上述两种不同的方法可以看出Scan的结果包含了rowkey本身。而get获取到的信息不包含rowkey的值。另外get的column于cell是分开的。而Scan是2者结合在一起的。
另外Scan中FILTER过滤“PrefixFilter”关键字是用来筛选rowkey的。
4. get于Scan获取table中单条数据信息中的区别
《相同点》
hbase(main):229:0> get "liupeng:employee",\'1001\',\'info:phone\'
COLUMN CELL
info:phone timestamp=1527914569028, value=15962459503
1 row(s) in 0.0320 seconds
hbase(main):230:0> scan "liupeng:employee",FILTER=>"PrefixFilter(\'1001\')AND ValueFilter(=,\'substring:159\')"
ROW COLUMN+CELL
1001 column=info:phone, timestamp=1527914569028, value=15962459503
1 row(s) in 0.1010 seconds
《不同点》
##注意事项:上述都可以把table中rowkey为1002,元素为\'159\'的信息查询出来。但是查询的方式截然不同。get是通过指定固定的value \'contect:phone\'来获取到的。
而scan是通过PerfixFilter指定固定的rowkey,然后通过AND条件语句结合ValueFilter指定模糊查询的字符串159查出来的。如果不知道对应的value是contect:phone的基础上
显然Scan这种模糊查询的方式更加高效。
另外Scan下面这种相同语句的查询用get语法是做不到的。例如:
=================================================================================================================
hbase(main):026:0> scan \'liupeng:employee\',FILTER=>"ValueFilter(=,\'substring:159\')"
ROW COLUMN+CELL
1001 column=contect:phone, timestamp=1522202430196, value=15962459503
1002 column=contect:phone, timestamp=1522202527866, value=15977634464
##解释:上述是通过模糊查询直接找到了只要包含159的字段的值就全部显示出来。而get的语法如下所视必须指定rowkey的基础上才可以查询columns。这就需要对rowkey定义的时候
考虑全面的涉及才可以做到。因此从这点来看Scan的方法个人认为比get获取信息更加的便捷。
hbase> t.get \'r1\'
hbase> t.get \'r1\', {TIMERANGE => [ts1, ts2]}
hbase> t.get \'r1\', {COLUMN => \'c1\'}
hbase> t.get \'r1\', {COLUMN => [\'c1\', \'c2\', \'c3\']}
hbase> t.get \'r1\', {COLUMN => \'c1\', TIMESTAMP => ts1}
hbase> t.get \'r1\', {COLUMN => \'c1\', TIMERANGE => [ts1, ts2], VERSIONS => 4}
hbase> t.get \'r1\', {COLUMN => \'c1\', TIMESTAMP => ts1, VERSIONS => 4}
hbase> t.get \'r1\', {FILTER => "ValueFilter(=, \'binary:abc\')"}
hbase> t.get \'r1\', \'c1\'
hbase> t.get \'r1\', \'c1\', \'c2\'
hbase> t.get \'r1\', [\'c1\', \'c2\']
5. Scan方法可以不用指定rowkey检索的情况下直接找valuse值。更具体点说也就是我们要找的哪个column中的哪个value值。get方法是无法做到这一点的。
ColumnPrefixFilter(\'列名\')
hbase(main):038:0> scan \'liupeng:employee\',FILTER=>"ColumnPrefixFilter(\'name\')"
ROW COLUMN+CELL
1001 column=info:name, timestamp=1522202364156, value=liupeng
1002 column=info:name, timestamp=1522202474669, value=Jack_Ma
1003 column=info:name, timestamp=1522202561029, value=kevin_shi
3 row(s) in 0.0210 seconds
##注释:ColumnPrefixFilter代表指定具体哪一个column(key(info)对应的value(name))。
6. Scan方法方便在于它可以随意指定rowkey,column以及value的值来进行查找。还可以结合AND,ORD等条件语句并用来找到自己想要的数据。
下列语法是AND及OR的连用方法。但是同一条语句中相同的条件语句不可以同时使用。例如AND ....AND..这种方法是不允许的。
hbase(main):060:0> scan \'liupeng:employee\',FILTER=>"ColumnPrefixFilter(\'ph\')AND ValueFilter(=,\'substring:15962\')OR ValueFilter(=,\'substring:186\')"
ROW COLUMN+CELL
1001 column=contect:phone, timestamp=1522202430196, value=15962459503
1003 column=contect:phone, timestamp=1522202605976, value=18665851263
2 row(s) in 0.0170 seconds
7. 通过SingleColumnValueFilter类方法指定检索值列举出检索值对应的所有列及value数据
hbase(main):242:0> scan "liupeng:employee",{FILTER=>"SingleColumnValueFilter(\'info\',\'age\',=,\'substring:30\')"}
ROW COLUMN+CELL
1005 column=contect:mail, timestamp=1528420218800, value=zhangsan@163.com
1005 column=info:age, timestamp=1528439967493, value=30
1005 column=info:name, timestamp=1528420218800, value=zhangsan
1008 column=contect:mail, timestamp=1528681786126, value=www.kevin@alibaba.com
1008 column=info:age, timestamp=1528681786126, value=30
1008 column=info:name, timestamp=1528681786126, value=kevin
2 row(s) in 0.0110 seconds
8. SingleColumnValueFilter类还提供正则表达式查询方法。可以通过模糊查询来查找对应的rowkeys,columns以及values。
hbase(main):244:0> scan "liupeng:employee",{FILTER=>"SingleColumnValueFilter(\'info\',\'name\',=,\'regexstring:liu\')"}
ROW COLUMN+CELL
1001 column=contect:mail, timestamp=1527231141046, value=liupliup@cn.ibm.com
1001 column=info:address, timestamp=1527753987327, value=shanghai
1001 column=info:age, timestamp=1527231097033, value=34
1001 column=info:name, timestamp=1527231081262, value=liupeng
1001 column=info:phone, timestamp=1527914569028, value=15962459503
1004 column=contect:mail, timestamp=1527473497956, value=lqdong@jingdong.com
1004 column=info:address, timestamp=1527755135174, value=shenzhen
1004 column=info:age, timestamp=1527473477124, value=40
1004 column=info:name, timestamp=1527415665182, value=liuqiangdong
2 row(s) in 0.0080 seconds