目录
- 一、Shell基本使用命令
- 进入Hbase shell
- 查看帮助命令
- 1.创建表
- 2.插入数据到表
- 3.扫描查看表数据
- 4.查看表结构
- 5.更新指定字段的数据
- 6.查看“指定行”或“指定列族:列”的数据
- 7.统计表数据行数
- 8.删除数据
- 9.清空表数据
- 10.删除表
- 11.变更表信息
- 二、HBase常用API
- HBase API类
- 1. HBaseAdmin
- 2. HBaseConfiguration
- 3. HTableDescriptor
- 4. HColumnDescriptor
- 5. HTable
- 6. Put
- 7. Get
- 8. Result
- Java API测试
一、Shell基本使用命令
进入Hbase shell
[root@master ~]# hbase shell
查看帮助命令
查看帮助
hbase(main):001:0> help
查看当前数据库中有哪些表
hbase(main):002:0> list
1.创建表
语法:create < table>, {NAME => < family>, VERSIONS => < VERSIONS>}
创建一个student表,并且有一个info列族:
hbase(main):002:0> create 'student','info'
2.插入数据到表
语法:put < table >,< rowkey >,< family : column >,< value >
hbase(main):003:0> put 'student','1001','info:sex','male'
hbase(main):004:0> put 'student','1001','info:age','18'
hbase(main):005:0> put 'student','1002','info:name','Janna'
hbase(main):006:0> put 'student','1002','info:sex','female'
hbase(main):007:0> put 'student','1002','info:age','20'
3.扫描查看表数据
语法:scan < table>, {COLUMNS => [ < family:column>,… ], LIMIT => num}
范围查询:STARTROW(开始rowkey) ENDROW(结束rowkey)
扫描所有记录: scan ‘student’
扫描前两条:scan ‘User’, {LIMIT => 2}
另外,还可以添加TIMERANGE
和FITLER
等高级功能;STARTROW,ENDROW必须大写
,否则报错;查询结果不包含
等于ENDROW的结果集
hbase(main):008:0> scan 'student'
hbase(main):009:0> scan 'student',{STARTROW => '1001', STOPROW => '1001'}
hbase(main):010:0> scan 'student',{STARTROW => '1001'}
4.查看表结构
hbase(main):011:0> describe ‘student’
5.更新指定字段的数据
hbase(main):012:0> put 'student','1001','info:name','Nick'
hbase(main):013:0> put 'student','1001','info:age','100'
6.查看“指定行”或“指定列族:列”的数据
语法:get < table>,< rowkey>,[ < family:column>,…]
hbase(main):014:0> get 'student','1001'
hbase(main):015:0> get 'student','1001','info:name'
7.统计表数据行数
语法:count < table>, {INTERVAL => intervalNum, CACHE => cacheNum}
hbase(main):021:0> count 'student'
8.删除数据
删除某 rowkey 的全部数据:
hbase(main):016:0> deleteall 'student','1001'
删除某 rowkey 的某一列数据:
hbase(main):017:0> delete 'student','1002','info:sex'
9.清空表数据
清空前,必须
先disable
hbase(main):018:0> truncate 'student'
提示:清空表的操作顺序为先 disable,然后再 truncate。
10.删除表
删除前,必须
先disable
首先需要先让该表为 disable 状态:
hbase(main):019:0> disable 'student'
然后才能 drop 这个表:
hbase(main):020:0> drop 'student'
提示:如果直接 drop 表,会报错:ERROR: Table student is enabled. Disable it first.
11.变更表信息
将 info 列族中的数据存放 3 个版本
hbase(main):022:0> alter 'student',{NAME=>'info',VERSIONS=>3}
hbase(main):022:0> get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
二、HBase常用API
HBase API类
HBase API类和数据模型之间的对应关系
1. HBaseAdmin
类: org.apache.hadoop.hbase.client.HBaseAdmin
作用:提供了一个接口来管理 HBase 数据库的表信息。它提供的方法包括:创建表,删 除表,列出表项,使表有效或无效,以及添加或删除表列族成员等。
2. HBaseConfiguration
类:org.apache.hadoop.hbase.HBaseConfiguration
作用:对 HBase 进行配置
3. HTableDescriptor
类: org.apache.hadoop.hbase.HTableDescriptor
作用:包含了表的名字极其对应表的列族
4. HColumnDescriptor
类:org.apache.hadoop.hbase.HColumnDescriptor
作用:维护着关于列族的信息,例如版本号,压缩设置等。它通常在创建表或者为表添 加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重新创建的方式。列族被删除的时候,列族里面的数据也会同时被删除。
5. HTable
类: org.apache.hadoop.hbase.client.Htable
作用:可以用来和 HBase 表直接通信。此方法对于更新操作来说是非线程安全的。
6. Put
类: org.apache.hadoop.hbase.client.Put
作用:用来对单个行执行添加操作
@Test
/**
* Put 插入一条数据
*/
public void put() throws IOException {
Table testAPI = conn.getTable(TableName.valueOf("testAPI"));
Put put = new Put("0002".getBytes());
put.addColumn("cf1".getBytes(),"name".getBytes(),"李四".getBytes());
put.addColumn("cf1".getBytes(),"age".getBytes(),"22".getBytes());
put.addColumn("cf1".getBytes(),"gender".getBytes(),"男".getBytes());
put.addColumn("cf1".getBytes(),"phone".getBytes(),"188 7777 8777".getBytes());
testAPI.put(put);
}
7. Get
类: org.apache.hadoop.hbase.client.Get
作用:用来获取单个行的相关信息
@Test
/**
* get 根据rowkey获取一条数据
*/
public void get() throws IOException {
Table testAPI = conn.getTable(TableName.valueOf("testAPI"));
Result result = testAPI.get(new Get("0002".getBytes()));
byte[] row = result.getRow();
System.out.println(row);
System.out.println(new String(row));
System.out.println(Bytes.toString(row));
//
byte[] name = result.getValue("testAPI".getBytes(), "name".getBytes());
byte[] age = result.getValue("testAPI".getBytes(), "age".getBytes());
byte[] gender = result.getValue("testAPI".getBytes(), "gender".getBytes());
System.out.println(Bytes.toString(name)+" "+Bytes.toString(age)+" "+Bytes.toString(gender));
}
8. Result
类: org.apache.hadoop.hbase.client.Result
作用:存储 Get 或者 Scan 操作后获取表的单行值。使用此类提供的方法可以直接获取值 或者各种 Map 结构( key-value 对)
Java API测试
students.txt 数据:
1500100001,施笑槐,22,女,文科六班
1500100002,吕金鹏,24,男,文科六班
1500100003,单乐蕊,22,女,理科六班
…
package com.test.java;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class Demo2API {
Connection conn;
Admin admin;
@Before
public void createConn() throws IOException {
// 1、创建一个配置文件
Configuration conf = HBaseConfiguration.create();
// 配置ZK的地址,通过ZK可以找到HBase
conf.set("hbase.zookeeper.quorum", "master:2181,node1:2181,node2:2181");
// 2、创建连接
conn = ConnectionFactory.createConnection(conf);
// 3、创建Admin对象
admin = conn.getAdmin();
}
@Test
/**
* create table
*
* student info
*/
public void createTable() throws IOException {
HTableDescriptor student = new HTableDescriptor(TableName.valueOf("student"));
HColumnDescriptor info = new HColumnDescriptor("info");
// info.setTimeToLive(100);// 对列簇进行配置
student.addFamily(info);
admin.createTable(student);
}
@Test
/**
* drop table
*/
public void dropTable() throws IOException {
TableName test2 = TableName.valueOf("test2");
// 判断表是否存在
if (admin.tableExists(test2)) {
admin.disableTable(test2);
admin.deleteTable(test2);
}
}
@Test
/**
* 修改表结构
* 针对test表 将其info列簇的ttl设置为10000,并增加一个新的列簇cf1
*/
public void modifyTable() throws IOException {
TableName test = TableName.valueOf("test");
// 获取表原有的结构
HTableDescriptor tableDescriptor = admin.getTableDescriptor(test);
// 在表原有的结构中 修改列簇的属性
HColumnDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies();
// 遍历表中原有的列簇
for (HColumnDescriptor cf : columnFamilies) {
// 对原有的info列簇进行修改
if ("info".equals(cf.getNameAsString())) {
cf.setTimeToLive(10000);
}
}
// 新增一个列簇
HColumnDescriptor cf1 = new HColumnDescriptor("cf1");
tableDescriptor.addFamily(cf1);
admin.modifyTable(test, tableDescriptor);
}
@Test
/**
* list 列出所有的表
*/
public void list() throws IOException {
TableName[] tableNames = admin.listTableNames();
for (TableName name : tableNames) {
System.out.println(name.getNameAsString());
}
}
@Test
/**
* put 插入一条数据
*/
public void put() throws IOException {
Table testAPI = conn.getTable(TableName.valueOf("testAPI"));
Put put = new Put("0002".getBytes());
// 相当于插入一列(一个cell)数据
put.addColumn("cf1".getBytes(), "name".getBytes(), "李四".getBytes());
put.addColumn("cf1".getBytes(), "age".getBytes(), "23".getBytes());
put.addColumn("cf1".getBytes(), "phone".getBytes(), "18888887".getBytes());
testAPI.put(put);
}
@Test
/**
* get 根据rowkey获取一条数据
*/
public void get() throws IOException {
Table testAPI = conn.getTable(TableName.valueOf("testAPI"));
Get get = new Get("0002".getBytes());
Result rs = testAPI.get(get);
// 获取rk
byte[] rk = rs.getRow();
System.out.println(rk);
System.out.println(Bytes.toString(rk));
// 获取cell
byte[] name = rs.getValue("cf1".getBytes(), "name".getBytes());
System.out.println(name);
System.out.println(Bytes.toString(name));
}
@Test
/**
* putAll 读取学生信息数据并写入HBase的student表
*/
public void putAll() throws IOException {
/**
* 读取学生信息数据
*/
BufferedReader br = new BufferedReader(new FileReader("data/students.txt"));
// 与HBase中的student表建立连接
Table student = conn.getTable(TableName.valueOf("student"));
String line = null;
// 创建Put的集合
ArrayList<Put> puts = new ArrayList<>();
int batchSize = 11;
while ((line = br.readLine()) != null) {
// 写入HBase
String[] splits = line.split(",");
String id = splits[0];
String name = splits[1];
String age = splits[2];
String gender = splits[3];
String clazz = splits[4];
Put put = new Put(id.getBytes());
byte[] info = "info".getBytes();
put.addColumn(info, "name".getBytes(), name.getBytes());
put.addColumn(info, "age".getBytes(), age.getBytes());
put.addColumn(info, "gender".getBytes(), gender.getBytes());
put.addColumn(info, "clazz".getBytes(), clazz.getBytes());
// 每条数据都会执行一次,效率很慢
// student.put(put);
// 将每个Put对象加入puts集合
puts.add(put);
// 当puts集合的大小同batchSize大小一致时,则调用HTable的put方法进行批量写入
if (puts.size() == batchSize) {
student.put(puts);
// 清空集合
puts.clear();
}
}
System.out.println(puts.isEmpty());
System.out.println(puts.size());
// 当batchSize的大小同数据的条数不成整比的时候 可能会造成最后几条数据未被写入
// 手动去判断puts集合是否为空,不为空则将其写入HBase
if (!puts.isEmpty()) {
student.put(puts);
}
br.close();
}
@After
/**
* 关闭资源
*/
public void close() throws IOException {
admin.close();
conn.close();
}
}