目录

  • 一、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}
另外,还可以添加TIMERANGEFITLER等高级功能;
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类和数据模型之间的对应关系

hbase shell 查看表列 查询hbase表shell语句_hbase shell 查看表列

1. HBaseAdmin

类: org.apache.hadoop.hbase.client.HBaseAdmin
作用:提供了一个接口来管理 HBase 数据库的表信息。它提供的方法包括:创建表,删 除表,列出表项,使表有效或无效,以及添加或删除表列族成员等。

hbase shell 查看表列 查询hbase表shell语句_大数据_02

2. HBaseConfiguration

类:org.apache.hadoop.hbase.HBaseConfiguration
作用:对 HBase 进行配置

hbase shell 查看表列 查询hbase表shell语句_hbase_03

3. HTableDescriptor

类: org.apache.hadoop.hbase.HTableDescriptor
作用:包含了表的名字极其对应表的列族

hbase shell 查看表列 查询hbase表shell语句_hbase shell 查看表列_04

4. HColumnDescriptor

类:org.apache.hadoop.hbase.HColumnDescriptor
作用:维护着关于列族的信息,例如版本号,压缩设置等。它通常在创建表或者为表添 加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重新创建的方式。列族被删除的时候,列族里面的数据也会同时被删除。

hbase shell 查看表列 查询hbase表shell语句_hbase_05

5. HTable

类: org.apache.hadoop.hbase.client.Htable
作用:可以用来和 HBase 表直接通信。此方法对于更新操作来说是非线程安全的。

hbase shell 查看表列 查询hbase表shell语句_大数据_06


hbase shell 查看表列 查询hbase表shell语句_大数据_07

6. Put

类: org.apache.hadoop.hbase.client.Put
作用:用来对单个行执行添加操作

hbase shell 查看表列 查询hbase表shell语句_数据库_08

@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
作用:用来获取单个行的相关信息

hbase shell 查看表列 查询hbase表shell语句_数据库_09

@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 对)

hbase shell 查看表列 查询hbase表shell语句_java_10

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();
    }
}