Hbase常用API操作,主要包括表的创建,数据的添加,获取,预分区的使用和Filter使用。
环境: Hadoop 2.5, Hbase版本0.98
代码
package net.itzoo; import java.io.IOException; import java.math.BigInteger; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; 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.filter.CompareFilter.CompareOp; import org.apache.hadoop.hbase.filter.FilterList; import org.apache.hadoop.hbase.filter.PrefixFilter; import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; import org.junit.After; import org.junit.Before; import org.junit.Test; public class Hbase { private HBaseAdmin admin; private HTable table; private String name = "calllist"; private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); @Before public void setUp() { Configuration conf = new Configuration(); conf.set("hbase.zookeeper.quorum", "node1,node2,node3"); try { admin = new HBaseAdmin(conf); table = new HTable(conf, name); } catch (Exception e) { e.printStackTrace(); } } @After public void end() { try { admin.close(); table.close(); } catch (IOException e) { e.printStackTrace(); }finally{ // try { // table.flushCommits(); // } catch (Exception e) { // e.printStackTrace(); // } } } //创建表 @Test public void createTbl() throws Exception { if(admin.tableExists(name)) { admin.disableTable(name); admin.deleteTable(name); } //指定表的命名空间 // admin.createNamespace(NamespaceDescriptor.create("myHbase").build()); HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(name)); // desc.setDurability(Durability.SYNC_WAL); HColumnDescriptor family = new HColumnDescriptor("cf1"); family.setInMemory(true); family.setMaxVersions(1); family.setInMemory(true); desc.addFamily(family); admin.createTable(desc); //创建预分区表 // admin.createTable(desc, arg1); } //添加数据 @Test public void putData() throws Exception { String rowkey = "18336352609_45689784"; Put put = new Put(rowkey.getBytes()); put.add("cf1".getBytes(), "phone".getBytes(), "13164395330".getBytes()); put.add("cf1".getBytes(), "date".getBytes(), "564398456".getBytes()); put.add("cf1".getBytes(), "type".getBytes(), "1".getBytes()); table.put(put); } //获取1条数据 @Test public void getData() throws Exception { String rowkey = "18336352609_45689784"; Get get = new Get(rowkey.getBytes()); get.addColumn("cf1".getBytes(), "phone".getBytes()); get.addColumn("cf1".getBytes(), "type".getBytes()); Result result = table.get(get); Cell cell = result.getColumnLatestCell("cf1".getBytes(), "phone".getBytes()); Cell cell2 = result.getColumnLatestCell("cf1".getBytes(), "type".getBytes()); String str = new String(CellUtil.cloneValue(cell)); String str2 = new String(CellUtil.cloneValue(cell2)); System.out.println(str + str2); } //获取数据 @Test public void scanData() throws Exception { Scan scan = new Scan(); String startRow = "13129566180_" + (Long.MAX_VALUE-sdf.parse("2017010100000000").getTime()); String stopRow = "13129566180_" + (Long.MAX_VALUE-sdf.parse("2016010100000000").getTime()); scan.setStartRow(startRow.getBytes()); scan.setStopRow(stopRow.getBytes()); ResultScanner rs = table.getScanner(scan); for(Result r : rs) { System.out.println(new String (CellUtil.cloneValue(r.getColumnLatestCell("cf1".getBytes(), "phone".getBytes())))); System.out.println(new String (CellUtil.cloneValue(r.getColumnLatestCell("cf1".getBytes(), "type".getBytes())))); } } //添加数据 @Test public void insertDates() throws Exception { List<Put> puts = new ArrayList<Put>(); for(int i = 0; i < 10; i++) { String phone = getPhone("131"); for(int j = 0; j < 100; j++) { Date date = sdf.parse(getDateTime()); String rowkey = phone +"_"+(Long.MAX_VALUE-date.getTime()); System.out.println("rowkey:" + rowkey); Put put = new Put(rowkey.getBytes()); put.add("cf1".getBytes(), "phone".getBytes(), getPhone("183").getBytes()); put.add("cf1".getBytes(), "type".getBytes(), (r.nextInt(2)+"").getBytes()); puts.add(put); } } table.put(puts); } /** * 预分区 * @param startKey * @param endKey * @param numRegions * @return */ public static byte[][] getHexSplits(String startKey, String endKey,int numRegions) { byte[][] splits =new byte[numRegions-1][]; BigInteger lowestKey =new BigInteger(startKey,16); BigInteger highestKey =new BigInteger(endKey,16); BigInteger range = highestKey.subtract(lowestKey); BigInteger regionIncrement = range.divide(BigInteger.valueOf(numRegions)); lowestKey = lowestKey.add(regionIncrement); for(int i=0; i < numRegions-1;i++) { BigInteger key = lowestKey.add(regionIncrement.multiply(BigInteger.valueOf(i))); byte[] b = String.format("%016x", key).getBytes(); splits[i] = b; } return splits; } //筛选出指定数据 @Test public void filter() throws Exception { FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL); PrefixFilter preFilter = new PrefixFilter("13195453889_".getBytes()); list.addFilter(preFilter); SingleColumnValueFilter valFilter = new SingleColumnValueFilter( "cf1".getBytes(), "type".getBytes(), CompareOp.EQUAL, "1".getBytes()); list.addFilter(valFilter); Scan scan = new Scan(); scan.setFilter(list); ResultScanner res = table.getScanner(scan); for(Result r : res) { System.out.println(new String(CellUtil.cloneValue(r.getColumnLatestCell("cf1".getBytes(), "phone".getBytes()))) +"-" +new String(CellUtil.cloneValue(r.getColumnLatestCell("cf1".getBytes(), "type".getBytes())))); } } Random r = new Random(); public String getPhone(String perfix) { return perfix + String.format("%08d", r.nextInt(99999999)); } public String getDateTime() { String month = String.format("%02d", r.nextInt(12) + 1); String day = String.format("%02d", r.nextInt(30) + 1); String hour = String.format("%02d", r.nextInt(24)); String mon = String.format("%02d", r.nextInt(60)); String s = String.format("%02d", r.nextInt(60)); return 2016+month+day+hour+mon+s; } public static void main(String[] args) { Hbase h = new Hbase(); System.out.println(h.getPhone("131")); } }