进入shell:
hbase shell
1. 查看共有哪些表:list
2. 查询表记录数:count ‘tablename’
有三种方法:
方法一:
hbase> count ‘t1′
hbase> count ‘t1′, INTERVAL => 100000
hbase> count ‘t1′, CACHE => 1000
hbase> count ‘t1′, INTERVAL => 10, CACHE => 1000
其中,INTERVAL为统计的行数间隔,默认为1000,CACHE为统计的数据缓存。这种方式效率很低,如果表行数很大的话不建议采用这种方式
方法二:
调用Mapreduce
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘tablename’
这种方式效率比上一种要高很多,调用的hbase jar中自带的统计行数的类。
扫描了一张64条记录的表,用了好几十秒。主要是启动mapreduce慢,如果是万行以上的大表,可能比count命令快。
方法三:
hive over hbase
如果已经见了hive和hbase的关联表的话,可以直接在hive中执行sql语句统计hbase表的行数。
hive over hbase 表的建表语句为:
/*创建hive与hbase的关联表*/
CREATE TABLE hive_hbase_1(key INT,value STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,cf:val")
TBLPROPERTIES("hbase.table.name"="t_hive","hbase.table.default.storage.type"="binary");
/*hive关联已经存在的hbase*/
CREATE EXTERNAL TABLE hive_hbase_1(key INT,value STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,cf:val")
TBLPROPERTIES("hbase.table.name"="t_hive","hbase.table.default.storage.type"="binary");
关于hbase的数据统计,count是全表扫描后再计数,效率十分低下,不建议这么做,如果是为了记录pv,uv的话,建议在插入记录的时候在另一张表就记录好count值,到时直接读值,不要去临时计数。
3. 扫描整张表:scan ‘tablename’
4. 取前两条记录:scan ‘tablename’,{LIMIT=>2}
5. 创建表create table,fieldFamily
表名和列族必须先初始化,该表才能使用。
示例,创建一个表test_newTable,只有一个列族prop:
create ’test_newTable’,’prop’
也可以使用更复杂的语句:
create 'test_newTable',{NAME => 'prop', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'true', BLOCKCACHE => 'true'}
如果有多个列族,以逗号隔开,如:
create ’test_newTable’,’prop’,’prop2’
参数含义:
参数名 | 含义 | 默认值 | 可取值 |
BLOCKSIZE | HFile数据块大小 | 65536(64K) | XB |
BLOOMFILTER | 布隆过滤器(占用内存空间) | NONE | ROW/ROWCOL |
IN_MEMORY | 数据块缓存(作用不大) | true | true,false |
COMPRESSION | 数据压缩(减少IO,增加CPU) |
| SNAPPY/GZIP |
VERSIONS | 单元时间版本 | 3 |
|
TTL | 生存时间 |
| X秒 |
6. 查看表结构describe tablename
语法:describe ‘tablename’
如:
hbase(main):004:0> describe 'test_newTable'
Table test_newTable is ENABLED
test_newTable
COLUMN FAMILIES DESCRIPTION
{NAME => 'prop', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL
=> 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0390 seconds
7. 添加列族
如添加”!lock!”列族
alter 'my_mutable7',{NAME=>'!lock!',VERSIONS=>1}
8. 添加记录
语法:
put ‘tablename’,’rowkey’,’family:column’,’value’
需要指定表名,rowkey,列族:列名,列值
如:put 'harve_merchant','d2e32686-5704-44df-8c58-428d3b6180a0','prop:settleAt','2018-01-12 11:00:00'
9. 修改记录
同添加记录
10. 通过rowkey查询记录
get ‘tablename’,’rowkey’
11. 通过条件查询记录
可以在shell中使用filter,但需要先引入其包,即需要按下面的顺序输入:
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 'share_people',{FILTER=>SingleColumnValueFilter.new(Bytes.toBytes('prop'),Bytes.toBytes('name'),CompareFilter::CompareOp.valueOf('EQUAL'), SubstringComparator.new('quxiaodan'))}
上面的例子是查'share_people'表中,prop列族,name为quxiaodan的记录
12. 删除记录
删除行中的某个列值:
语法:delete <table>,<rowkey>,<family:column>,<timestamp>
必须指定列名
例如:删除表t1,rowkey001中的f1:col1的数据
hbase(main)> delete 't1','rowkey001','f1:col1'
删除行:
语法:deleteall <table>, <rowkey>,<family:column>,<timestamp>
可以不指定列名,删除整行数据
例如:删除表t1,rowk001的数据
hbase(main)> deleteall 't1','rowkey001'
13. 清空表truncate tablename
truncate tablename
删除后再扫描表,将扫不到记录:
14. 删除表disable table;drop table
分两步:首先disable,然后drop