问题导读删除表应该注意什么问题?如何创建列族?如何插入数据?如何更新用户信息与关系型数据库更新的区别在什么地方?hbase通过什么标准来区别两条记录是否相同?所需要的包有:commons-codec-1.4.jar
commons-logging-1.1.1.jar
hadoop-0.20.2-core.jar
hbase-0.90.2.jar
log4j-1.2.16.jar
zookeeper-3.3.2.jar
背景:假设有一个部门人员表:)表里需要存入人员和其相对应的部门信息代码:import java.util.ArrayList;import java.util.List;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.client.Delete;import org.apache.hadoop.hbase.client.HBaseAdmin;import org.apache.hadoop.hbase.client.HTable;import org.apache.hadoop.hbase.client.Put;public class HbaseAddEdtDel {public static Configuration configuration=null; static { configuration = HBaseConfiguration.create(); configuration.set("hbase.master", "192.168.0.201:60000"); configuration.set("hbase.zookeeper.quorum","192.168.0.201,192.168.0.202,192.168.0.203"); configuration.set("hbase.zookeeper.property.clientPort", "2181"); } public static void main(String[] args) throws Exception { HBaseAdmin admin = new HBaseAdmin(configuration); if (admin.tableExists("riapguh")) { System.out.println("删除 table"); admin.disableTable("riapguh"); admin.deleteTable("riapguh"); } //创建riapguh表 System.out.println("创建 table"); HTableDescriptor tableDescripter = new HTableDescriptor("riapguh".getBytes());//创建表 tableDescripter.addFamily(new HColumnDescriptor("user"));//创建列簇user tableDescripter.addFamily(new HColumnDescriptor("dpt"));//创建列簇dpt admin.createTable(tableDescripter); HTable table = new HTable(configuration, "riapguh"); //插入数据 System.out.println("add riapguh data"); List<Put> putuser = new ArrayList<Put>(); Put user1 = new Put(new String("用户A").getBytes()); //写入用户员信息 user1.add(new String("user").getBytes(), new String("user_code").getBytes(), new String("u_0001").getBytes()); user1.add(new String("user").getBytes(), new String("user_name").getBytes(), new String("u_用户A").getBytes()); //写入部门信息 user1.add(new String("dpt").getBytes(), new String("dpt_code").getBytes(), new String("d_001").getBytes()); user1.add(new String("dpt").getBytes(), new String("dpt_name").getBytes(), new String("d_部门A").getBytes()); putuser.add(user1); Put user2 = new Put(new String("用户B").getBytes()); //写入用户员信息 user2.add(new String("user").getBytes(), new String("user_code").getBytes(), new String("u_0002").getBytes()); user2.add(new String("user").getBytes(), new String("user_name").getBytes(), new String("u_用户B").getBytes()); //写入部门信息 user2.add(new String("dpt").getBytes(), new String("dpt_code").getBytes(), new String("d_002").getBytes()); user2.add(new String("dpt").getBytes(), new String("dpt_name").getBytes(), new String("d_部门B").getBytes()); putuser.add(user2); Put user3 = new Put(new String("用户C").getBytes()); //写入用户员信息 user3.add(new String("user").getBytes(), new String("user_code").getBytes(), new String("u_0003").getBytes()); user3.add(new String("user").getBytes(), new String("user_name").getBytes(), new String("u_用户C").getBytes()); //写入部门信息 user3.add(new String("dpt").getBytes(), new String("dpt_code").getBytes(), new String("d_003").getBytes()); user3.add(new String("dpt").getBytes(), new String("dpt_name").getBytes(), new String("d_部门C").getBytes()); putuser.add(user3); table.put(putuser); table.flushCommits(); //更新用户B Put updateb = new Put(new String("用户B").getBytes()); //写入用户员信息 updateb.add(new String("user").getBytes(), new String("user_code").getBytes(), new String("u_000xsx").getBytes()); updateb.add(new String("user").getBytes(), new String("user_name").getBytes(), new String("u_用户xsx").getBytes()); //写入部门信息 updateb.add(new String("dpt").getBytes(), new String("dpt_code").getBytes(), new String("d_00xsx").getBytes()); updateb.add(new String("dpt").getBytes(), new String("dpt_name").getBytes(), new String("d_部门xsx").getBytes()); table.put(updateb); table.flushCommits(); //HBaseBasic.selectByRowKey("riapguh");对于更新里面:这里面我们需要知道是否是我们关系数据库中所理解的更新:我们看下面内容:-------------------------------------------------------------------------------------------------------------------------------------------
hbase是以rowkey,column,timestamp这三个维度来区分的。
即如果两条记录其rowkey,column,timestamp一样的话,那么hbase就会认为其是相同的数据。- row column value time
- put r1 cf:c1 '5' 10
- put r1 cf:c1 '6' 10
- put r1 cf:c2 '7'
- put r1 af:c2 '8'
- put r2 cf:c1 '9'
如上所示首先插入一条数据其值为5,然后又插入一条数据其值为6.
此时用客户端接口取到的都是value=‘6’的数据,这可以认为是对原数据的一个覆盖,即可以认为是更新。
-------------------------------------------------------------------------------------------------------------------------------------------
System.out.println("-------------删除用户C---------------------"); //删除用户C //able.delete(new Delete(new String("用户C").getBytes())); List<Delete> deld = new ArrayList<Delete>(); deld.add(new Delete(new String("用户C").getBytes())); table.delete(deld); table.flushCommits(); //HBaseBasic.selectByRowKey("riapguh"); }}