hbase 增删改查 java示例

来源:互联网 发布:网络机顶盒安卓系统 编辑:程序博客网 时间:2024/05/02 17:55
package test;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.hbase.Cell;import org.apache.hadoop.hbase.CellUtil;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.MasterNotRunningException;import org.apache.hadoop.hbase.TableName;import org.apache.hadoop.hbase.ZooKeeperConnectionException;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.HBaseAdmin;import org.apache.hadoop.hbase.client.HConnection;import org.apache.hadoop.hbase.client.HTable;import org.apache.hadoop.hbase.client.HTablePool;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.util.Bytes;import org.apache.log4j.PropertyConfigurator;import org.junit.Before;import org.junit.Test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class HbaseTest {private Configuration configuration;//@Before//public void init(){////configuration = HBaseConfiguration.create();//configuration.set("hbase.zookeeper.property.clientPort", "60010");///**// * 这里hbase.zookeeper.quorum的属性与hbase-site.xml中相对应的设置有关// * 1.在hbase-site.xml中,设置hbase.zookeeper.quorum为本地地址时,在填写以下hbase.zookeeper.quorum参数值时,请加上端口。// * ex:// * hbase-site.xml:// * <property>// *<name>hbase.zookeeper.quorum</name>// *<value>172.16.43.10</value>// *</property>// * configuration.set("hbase.zookeeper.quorum","172.16.43.10:2181");// * 注:2181端口是根据zookeeper中zoo.cfg设置的clientPort=2181值,也可通过登录Hbase Master管理页面,在最底下可以看到// * zookeeper的信息,可以直接把那边的拷贝过来。// * 2.在hbase-site.xml中,填写的是几个zookeeper地址,则将其以分号为分隔填入// * ex:// * hbase-site.xml:// * <property>// *<name>hbase.zookeeper.quorum</name>// *<value>172.16.43.10:2181,172.16.43.10:2182,172.16.43.10:2183</value>// *</property>// * configuration.set("hbase.zookeeper.quorum","172.16.43.10:2181,172.16.43.10:2182,172.16.43.10:2183");// *///configuration.set("hbase.zookeeper.quorum","192.168.10.4:4180,192.168.10.4:4181,192.168.10.4:4182");//configuration.set("hbase.master", "192.168.10.4:60000");////}public void init(){configuration = HBaseConfiguration.create();configuration.addResource(new Path("hbase-site.xml"));configuration.addResource(new Path("core-site.xml"));configuration.set("hbase.zookeeper.quorum", "192.168.60.158");}/** * 创建表 * @throws Exception *///@Testpublic void createTable(){Connection conn = null;try{conn = ConnectionFactory.createConnection(configuration);HBaseAdmin hBaseAdmin = (HBaseAdmin) conn.getAdmin();HTableDescriptor desc = new HTableDescriptor(TableName.valueOf("test"));//添加列簇desc.addFamily(new HColumnDescriptor("test_1"));desc.addFamily(new HColumnDescriptor("test_2"));desc.addFamily(new HColumnDescriptor("test_3"));//desc.setMaxFileSize(); //Range大小限制if(hBaseAdmin.tableExists("test")){System.out.println("table is exists !");//System.exit(0);}else{hBaseAdmin.createTable(desc);System.out.println("create table successfully.");}}catch(Exception e){System.out.println("create table unsuccessfully.");e.printStackTrace();}finally{if(null != conn){try {conn.close();} catch (IOException e) {e.printStackTrace();}}}}/* * 打印所有表结构 * */public void printAllTableSesc(){Connection conn = null;try {conn = ConnectionFactory.createConnection(configuration);HBaseAdmin hBaseAdmin = (HBaseAdmin) conn.getAdmin();HTableDescriptor[] htds = hBaseAdmin.listTables();for (HTableDescriptor htd:htds){System.out.println(htd.toString());}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 查询时,会每个cell代表一个列簇中的一个区域, * 例如:有一个列簇为 test_1 * 1.如果存储数据时没有存储列修饰符,则cell代表整个列簇的内容,查询出的就是该行下整个列簇的内容 * 2.如果存储数据时有存储列修饰符,则每个列簇下的列修饰符各有一个cell *  *///@Testpublic void query(){Connection conn = null;HTable table = null;ResultScanner scann = null;try{conn = ConnectionFactory.createConnection(configuration);table = (HTable) conn.getTable(TableName.valueOf("test"));scann = table.getScanner(new Scan());/** * 循环读取按行区分: * 读取结果为: * 该表RowKey为:1445320222118列簇为:test_1值为:这是第一行第一列的数据列簇为:test_2值为:这是第一行第二列的数据列簇为:test_3值为:这是第一行第三列的数据==========================================该表RowKey为:1445320222120列簇为:test_1值为:这是第二行第一列的数据列簇为:test_2值为:这是第二行第二列的数据列簇为:test_3值为:这是第二行第三列的数据========================================== */for(Result rs : scann){System.out.println("该表RowKey为:"+new String(rs.getRow()));/** * 这边循环是按cell进行循环 */for(Cell cell : rs.rawCells()){System.out.println("列簇为:"+new String(CellUtil.cloneFamily(cell)));System.out.println("列修饰符为:"+new String(CellUtil.cloneQualifier(cell)));System.out.println("值为:"+new String(CellUtil.cloneValue(cell)));}System.out.println("==========================================");}}catch(Exception e){e.printStackTrace();}finally{if(null != scann){scann.close();}if(null != table){try {table.close();} catch (IOException e) {e.printStackTrace();}}if(null != conn){try {conn.close();} catch (IOException e) {e.printStackTrace();}}}}/** * 根据RowKey查询单行 *///@Testpublic void queryByRowKey(){Connection conn = null;HTable table = null;try{conn = ConnectionFactory.createConnection(configuration);table = (HTable) conn.getTable(TableName.valueOf("test"));Result rs = table.get(new Get("1458104682477".getBytes()));System.out.println("test表 RowKey为1458104682477的行数据如下:");for(Cell cell : rs.rawCells()){//疑问:同个行,一个列簇里具有多列的查询?System.out.println("列簇为:"+new String(CellUtil.cloneFamily(cell)));System.out.println("列修饰符为:"+new String(CellUtil.cloneQualifier(cell)));System.out.println("值为:"+new String(CellUtil.cloneValue(cell)));}}catch(Exception e ){e.printStackTrace();}finally{if(null != table){try {table.close();} catch (IOException e) {e.printStackTrace();}}if(null != conn){try {conn.close();} catch (IOException e) {e.printStackTrace();}}}}/** * 插入数据 * @throws Exception  *///@Testpublic void insertData(){Connection conn = null;HTable hTable = null;try{conn = ConnectionFactory.createConnection(configuration);hTable = (HTable) conn.getTable(TableName.valueOf("test"));//一个PUT代表一行,构造函数传入的是RowKeyPut put = new Put((String.valueOf(System.currentTimeMillis())).getBytes());put.addColumn("test_1".getBytes(), "c1".getBytes(), "这是第一行第一列的数据".getBytes());put.addColumn("test_2".getBytes(), "c2".getBytes(), "这是第一行第二列的数据".getBytes());put.addColumn("test_3".getBytes(), "c2".getBytes(), "这是第一行第三列的数据".getBytes());//多增加一行Put put_2 = new Put((String.valueOf(System.currentTimeMillis())).getBytes());put_2.addColumn("test_1".getBytes(), "c1".getBytes(), "这是第二行第一列的数据".getBytes());put_2.addColumn("test_2".getBytes(), "c2".getBytes(), "这是第二行第二列的数据".getBytes());put_2.addColumn("test_3".getBytes(), "c3".getBytes(), "这是第二行第三列的数据".getBytes());List<Put> puts = new ArrayList<Put>();puts.add(put);puts.add(put_2);//添加进表中hTable.put(puts);}catch(Exception e){e.printStackTrace();}finally{if(null != hTable){try {hTable.close();} catch (IOException e) {e.printStackTrace();}}if(null != conn){try {conn.close();} catch (IOException e) {e.printStackTrace();}}}}/** * 向一个列簇中插入多个值 *///@Testpublic void insertColumsValue(){Connection conn = null;HTable table = null;try{conn = ConnectionFactory.createConnection(configuration);table = (HTable) conn.getTable(TableName.valueOf("test"));Put put = new Put("1458104682476".getBytes());//1.如果没有指定列修饰符,而在这之下已经有内容,则覆盖原先内容//2.如果有指定列修饰符,而在该列修饰符下如果存在内容则覆盖put.addColumn("test_1".getBytes(), "c1".getBytes(),"这是第一行第一列的第二个数值".getBytes());table.put(put);}catch(Exception e){e.printStackTrace();}finally{if(null != table){try {table.close();} catch (IOException e) {e.printStackTrace();}}if(null != conn){try {conn.close();} catch (IOException e) {e.printStackTrace();}}}}/** * 添加数据时,添加列修饰符 * 列修饰符:相当于在一个列簇中,根据列修饰符分隔成不同区域存储内容。(HBase的特性) * 插入后,查询到的数值: * 该表RowKey为:1445320222118列簇为:test_1列修饰符为:值为:这是第一行第一列的第二个数值列簇为:test_1列修饰符为:1值为:test_1_1列簇为:test_1列修饰符为:2值为:test_1_2列簇为:test_2列修饰符为:值为:这是第一行第二列的数据列簇为:test_3列修饰符为:值为:这是第一行第三列的数据==========================================该表RowKey为:1445320222120列簇为:test_1列修饰符为:值为:这是第二行第一列的数据列簇为:test_2列修饰符为:值为:这是第二行第二列的数据列簇为:test_3列修饰符为:值为:这是第二行第三列的数据========================================== *///@Testpublic void insertrAddColumnQualifier(){Connection conn = null;HTable table = null;try{conn = ConnectionFactory.createConnection(configuration);table = (HTable) conn.getTable(TableName.valueOf("test"));Put put = new Put("1458104682476".getBytes());put.addColumn("test_1".getBytes(), "1".getBytes(), "test_1_1".getBytes());put.addColumn("test_1".getBytes(), "2".getBytes(), "test_1_2".getBytes());table.put(put);}catch(Exception e){e.printStackTrace();}finally{try{table.close();conn.close();}catch(Exception e){e.printStackTrace();}}}/** * 删除指定名称的列簇 */@Testpublic void deleteFamily(){Connection conn = null;HBaseAdmin admin = null;try{conn = ConnectionFactory.createConnection(configuration);admin = (HBaseAdmin) conn.getAdmin();admin.deleteColumn("test".getBytes(), "test_3");}catch(Exception e){e.printStackTrace();}finally{try{if(null != conn){conn.close();}}catch(Exception e){e.printStackTrace();}}}/** * 删除指定行 */@Testpublic void deleteRow(){Connection conn = null;HTable table = null;try{conn = ConnectionFactory.createConnection(configuration);table = (HTable) conn.getTable(TableName.valueOf("test"));table.delete(new Delete("1458104682476".getBytes()));}catch(Exception e){e.printStackTrace();}finally{try{if(null != table){table.close();}if(null != conn){conn.close();}}catch(Exception e){e.printStackTrace();}}}/** * 删除指定表名 */@Testpublic void deleteTable(){Connection conn = null;HBaseAdmin admin = null;try{conn = ConnectionFactory.createConnection(configuration);admin = (HBaseAdmin) conn.getAdmin();if(admin.tableExists("test")){if(admin.isTableEnabled("test")){//在删除一张表前,要使其失效admin.disableTable("test");}admin.deleteTable("test");}}catch(Exception e){e.printStackTrace();}finally{try{if(null != conn){conn.close();}}catch(Exception e){e.printStackTrace();}}}public static void main(String[] args) {try {//PropertyConfigurator.configure( "conf/log4j.properties " );HbaseTest myHtest =new HbaseTest();myHtest.init();myHtest.createTable();myHtest.printAllTableSesc();myHtest.insertData();myHtest.deleteTable();myHtest.insertData();myHtest.insertColumsValue();myHtest.insertrAddColumnQualifier();myHtest.deleteFamily();myHtest.deleteRow();myHtest.deleteTable();myHtest.query();myHtest.queryByRowKey();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


0 0
原创粉丝点击