Java hbase的DDL和DML操作

原创
2017/05/30 23:39
阅读数 241

说明:需要在项目里面添加要操作的hbase的hbase-site.xml配置文件,

项目所需要的jar或依赖下载链接:

http://mvnrepository.com/artifact/org.apache.hbase

winutils.xml下载链接:

http://pan.baidu.com/s/1gfQkCuB

一、代码:

package examples.cn.lct.offline4.hbase.common;

import java.io.IOException;
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.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.Get;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TableOperationApp {
    static Logger logger = LoggerFactory.getLogger(TableOperationApp.class);
    
    public static void main(String[] args) throws Exception {
        //消除命令行的error,该erro没什么影响
        System.setProperty("hadoop.home.dir", "G:\\lct\\mis\\bigdatatest\\lib");
        
        //新的api中,使用TableName对象表示表名称
        TableName tableName = TableName.valueOf("t5");
        //列族名称
        String familyName = "c1"; 
        
        
        //使用HBaseConfiguration.create()作用是加载配置文件,会加载hbase自带的hbase-default.xml和hbase-site.xml文件
        Configuration conf = HBaseConfiguration.create();

        //获得一个操作HBase的连接
        Connection connection = ConnectionFactory.createConnection(conf);
        
        //tableDDL(tableName, familyName, connection);
        
        //DML由类Table完成,原来用HTable类
        Table table = connection.getTable(tableName);
        byte[] rowkey = Bytes.toBytes("r1");
        
        //putData(table, rowkey);
        
        //getData(table, rowkey);
        
        //scanData(table);
        
        //deleteData(table, rowkey);
        
        
        //程序员记得要关闭table
        table.close();
        
        //程序员一定记得关闭连接
        connection.close();
    }

    public static void deleteData(Table table, byte[] rowkey) throws IOException {
        Delete delete = new Delete(rowkey);
        delete.addColumn(Bytes.toBytes("c1"), Bytes.toBytes("q1"));
        table.delete(delete);
    }

    public static void scanData(Table table) throws IOException {
        Scan scan = new Scan();
        //scan.setStartRow(Bytes.toBytes("r3"));
        //scan.setStopRow(Bytes.toBytes("r5"));
        scan.setTimeRange(1, 4);
        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            printResult(result);
        }
    }

    /**
     * 使用get读取记录
     * @param table
     * @param rowkey
     * @throws IOException
     */
    public static void getData(Table table, byte[] rowkey) throws IOException {
        Get get = new Get(rowkey);
        Result result = table.get(get);
        System.out.println(result);
        
        //使用复杂的map迭代方式查看内容
        //printResult(result);

        //直接调用api取值
        //simpleGetValue(result);
    }

    public static void printResult(Result result) {
        //行键
        String rowkey = Bytes.toString(result.getRow());
        //三层嵌套map结构Map<family,Map<qualifier,Map<timestamp,value>>>
        NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map1 = result.getMap();
        
        for (Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> entry1 : map1.entrySet()) {
            //列族
            String family = Bytes.toString(entry1.getKey());
            for (Entry<byte[], NavigableMap<Long, byte[]>> entry2 : entry1.getValue().entrySet()) {
                //列限定符
                String qualifier = Bytes.toString(entry2.getKey());
                for(Entry<Long, byte[]> entry3 : entry2.getValue().entrySet()){
                    //时间戳
                    Long timestamp = entry3.getKey();
                    //值
                    String value = Bytes.toString(entry3.getValue());
                    System.out.println(rowkey+"\t"+family+"\t"+qualifier+"\t"+timestamp+"\t"+value);
                }
            }
        }
    }

    public static void simpleGetValue(Result result) {
        byte[] bytesValue = result.getValue(Bytes.toBytes("c1"), Bytes.toBytes("q1"));
        String v1 = new String(bytesValue);
        String v2 = Bytes.toString(bytesValue);
        System.out.println(v2);
    }

    public static void putData(Table table, byte[] rowkey) throws IOException {
        Put put = new Put(rowkey);
        byte[] family = Bytes.toBytes("c1");
        byte[] qualifier = Bytes.toBytes("q1");
        byte[] value = Bytes.toBytes("v1");
        put.addColumn(family, qualifier, value);
        table.put(put);
    }

    public static void tableDDL(TableName tableName, String familyName, Connection connection) throws IOException {
        //DDL由类Admin完成,原来用HBaseAdmin类
        Admin admin = connection.getAdmin();
        
        //td里面含有创建表所需要的各种信息
        HTableDescriptor td = new HTableDescriptor(tableName);
        //cd里面含有列族定义需要的各种信息
        HColumnDescriptor cd = new HColumnDescriptor(familyName);
        td.addFamily(cd);
        if (admin.tableExists(tableName)) {
            logger.info("开始disable表{}", tableName.getNameAsString());
            admin.disableTable(tableName);
            logger.info("开始delete表{}", tableName.getNameAsString());
            admin.deleteTable(tableName);
        }
        logger.info("开始create表{}", tableName.getNameAsString());
        admin.createTable(td);
        logger.info("开始truncate表{}", tableName.getNameAsString());
        admin.disableTable(tableName);
        admin.truncateTable(tableName, false);
        //程序员一定记得关闭admin
        admin.close();
    }
}
 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部