1,环境准备
如果对hbase还不了解可以看一下博客:
hbase介绍: https://blog.youkuaiyun.com/weixin_41122339/article/details/81901041
hbase基本命令: https://blog.youkuaiyun.com/weixin_41122339/article/details/81905065
1,jdk 1.8
2, hbase 1.2.6
3, maven+eclipse
4, 如果不想使用maven可在hbase的安装目录下的lib目录把所有jar包考到eclipse下
5,直接创建项目mvaven项目和普通项目看你们了
2,maven的pom文件(不使用maven略过)
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
</dependencies>
3,下面就是hbase 一些简单的api操作
首先说一下我想要下面运行成功,还需要配置一个hbase-site.xml文件,因为大家往下看会发现没有配置连接的端口号等一下配置信息,因为我把这些配置都配置到了hbase-site.xml文件中,这个文件其实就是咱们habse安装目录下的conf目录下的hbase-site.xml文件,如果和我配置的一样那么直接copy一下就行了,大家会问了为什么配置这个文件,api会识别这个文件吗,答案当然是可以的了,他源码中会自动加载一个default.xml和hbase-site.xml这两个文件默认配置咱们就不说了,hbase-site.xml这个文件直接copy到eclipse的src下,信息如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--绑定hbase在hdfs上的存储位置-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://t124:8020/user/hbase</value>
</property>
<!--启用分布式集群-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--配置独立的ZK集群地址-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>t125:2181,t126:2181,t127:2181</value>
</property>
</configuration>
代码块:
package myhbasedemo; import java.util.Iterator; import java.util.Map.Entry; import java.util.NavigableMap; 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.NamespaceDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.util.Bytes; import org.junit.Test; public class myhbaseTest { /** * 创建名字空间 * * @throws Exception */ @Test public void createNS() throws Exception { // 创建hbase配置对象他返回的hadoop的配置对象 Configuration conf = HBaseConfiguration.create(); // 通过连接工厂创建连接对象加载配置 Connection conn = ConnectionFactory.createConnection(conf); // 得到管理程序 Admin admin = conn.getAdmin(); // 创建名字空间使用createnamespace方法他构造需要传入一个namespaceDescriptor对象 // namespaceDescriptor对象需要使用namespaceDescriptor类名调用他的抽象方法create获取一个build对象构造里填入名字空间的名字 // build对象调用他的build方法返回namespaceDescriptor对象 admin.createNamespace(NamespaceDescriptor.create("zxz1").build()); } /** * 创建表和列族 * * @throws Exception * */ @Test public void createtable() throws Exception { // 创建hbase配置对象他返回的hadoop的配置对象 Configuration conf = HBaseConfiguration.create(); // 通过连接工厂创建连接对象加载配置 Connection conn = ConnectionFactory.createConnection(conf); // 得到管理程序 Admin admin = conn.getAdmin(); // 创建表之前要创建一个tablename对象默认在在默认空间创建表 // TableName.valueOf("zxz_table") // 这种是指定在zxz1名字空间创建 TableName tab = TableName.valueOf("zxz1", "zxz_table"); // 创建表还需要创建表描述对象创建,构造要添加tablename对象 HTableDescriptor htd = new HTableDescriptor(tab); // 添加列族,每个表至少要有一个列族使用addFamily方法添加列族,构造需要指定一个列族描述对象指定一个叫z1的列族 htd.addFamily(new HColumnDescriptor("z1")); // admin.createTable(new HTableDescriptor()); // 使用createtable创建表,构造添加一个表描述对象上面已经定义好了 admin.createTable(htd); } /** * 插入数据 * * @throws Exception */ @Test public void putdata() throws Exception { // 创建hbase配置对象他返回的hadoop的配置对象 Configuration conf = HBaseConfiguration.create(); // 通过连接工厂创建连接对象加载配置 Connection conn = ConnectionFactory.createConnection(conf); // 因为是ddl语言所以用不到管理对象 // 获得table对象使用gettable方法,构造需要一个tablename对象需要指定名字空间和表名 Table tab = conn.getTable(TableName.valueOf("zxz1", "zxz_table")); // 创建put对象他构造需要传入一个字节数组的rowkey,我们可以使用hbase封装好的Bytes对象的tobytes方法来指定rowkey Put put = new Put(Bytes.toBytes("zrow1")); // 添加数据调用addcolumn方法,构造需要传入列族,列,值这三个值,都需要是byte[]类型的 put.addColumn(Bytes.toBytes("z1"), Bytes.toBytes("name"), Bytes.toBytes("tom")); put.addColumn(Bytes.toBytes("z1"), Bytes.toBytes("age"), Bytes.toBytes(12)); put.addColumn(Bytes.toBytes("z1"), Bytes.toBytes("sex"), Bytes.toBytes("男")); // 使用table对象的put方法构造是刚才定义的put对象 tab.put(put); // 关流 tab.close(); } /** * 删除数据 * * @throws Exception */ @Test public void deletedata() throws Exception { // 创建hbase配置对象他返回的hadoop的配置对象 Configuration conf = HBaseConfiguration.create(); // 通过连接工厂创建连接对象加载配置 Connection conn = ConnectionFactory.createConnection(conf); // 因为是ddl语言所以用不到管理对象 // 获得table对象使用gettable方法,构造需要一个tablename对象需要指定名字空间和表名 Table tab = conn.getTable(TableName.valueOf("zxz1", "zxz_table")); // 创建delete对象指定rowkey Delete del = new Delete(Bytes.toBytes("zrow1")); // 如果是删除某个rowkey的值只需要指定列族和列就行了我们这里删除一条就好了 del.addColumn(Bytes.toBytes("z1"), Bytes.toBytes("sex")); // 删除delete对象指定的数据 tab.delete(del); tab.close(); } /** * 扫描数据 * * @throws Exception */ @Test public void scandata() throws Exception { // 创建hbase配置对象他返回的hadoop的配置对象 Configuration conf = HBaseConfiguration.create(); // 通过连接工厂创建连接对象加载配置 Connection conn = ConnectionFactory.createConnection(conf); // 因为是ddl语言所以用不到管理对象 // 获得table对象使用gettable方法,构造需要一个tablename对象需要指定名字空间和表名 Table tab = conn.getTable(TableName.valueOf("zxz1", "zxz_table")); // 创建scan对象 Scan scan = new Scan(); // 得到扫描器对象,利用table对象的getscanner方法构造把scan对象传进去 ResultScanner scanner = tab.getScanner(scan); // 我们通过迭代器遍历这个结果集扫描器对象返回一个迭代器 Iterator<Result> iterator = scanner.iterator(); // 使用while虚幻遍历迭代器对象 while (iterator.hasNext()) { // 返回hbase的结果集对象 Result rs = iterator.next(); // 调用getfamilymap()方法指定一个byte数组类型的列族,返回一个可导航的map,他会得到顺序的值 NavigableMap<byte[], byte[]> nm = rs.getFamilyMap(Bytes.toBytes("z1")); // 遍历map对象得到所有的列和值 for (Entry<byte[], byte[]> result : nm.entrySet()) { // 遍历列,因为都是字符串所以转为字符串 String key = Bytes.toString(result.getKey()); // 先遍历出来等判断后转为自己本身的类型 byte[] value = result.getValue(); // 我这里只有age列的值是int类型所以判断一下 if (key.equals("age")) { System.out.println(key + " " + (Bytes.toInt(value))); } System.out.println(key + " " + Bytes.toString(value)); } } tab.close(); } }
后续还有!