1、创建封装对象 (列簇项)
package com.aura.bean; import java.io.Serializable; //hbase 列簇项 public class CategoryClickCount implements Serializable { //点击的品类 private String name; //点击的次数 private long count; public String getName() { return name; } public void setName(String name) { this.name = name; } public long getCount() { return count; } public void setCount(long count) { this.count = count; } public CategoryClickCount(String name, long count) { this.name = name; this.count = count; } }
2、编写接口 插入与查询
package com.aura.dao; import com.aura.bean.CategoryClickCount; import java.util.List; //插入与查询 接口 public interface HBaseDao { //往hbase里面插入一条数据 public void save(String tableName,String rowkey,String family,String q,long value); //根据rowkey(查询)返回数据
/** * 在Hbase查询中 输入tableName与rowkey 比按(输入)family或者时间戳 更快 * 因为(输入)family或者时间戳会降低查询性能 */public List<CategoryClickCount> count(String tableName,String rowkey);}
3、编写实现类
package com.aura.dao.impl; import com.aura.bean.CategoryClickCount; import com.aura.dao.HBaseDao; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.filter.PrefixFilter; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; import java.util.ArrayList; import java.util.List; //实现类 public class HBaseImpl implements HBaseDao { HConnection htablePool = null; //HConnection 获取HBase连接 类似于JDBC public HBaseImpl(){//创建类自动加载
//设置程序入口 Configuration conf = HBaseConfiguration.create(); //HBase自带的zookeeper conf.set("hbase.zookeeper.quorum","hadoop02:2181");//zookeeper监控中一个的hbase端口号 //conf.set("zookeeper.znode.parent","/mybase");
// HBase原数据存在zookeeper中的mybase目录下 (此时本集群没有配置这个参数,所以省略)
try { htablePool = HConnectionManager.createConnection(conf); } catch (IOException e) { e.printStackTrace(); } } /** *根据表名获取表对象 * tableName 表名 * return 表对象 */ public HTableInterface getTable(String tableName){//根据表名获取表对象 HTableInterface table = null; try { table = htablePool.getTable(tableName); } catch (IOException e) { e.printStackTrace(); } return table; } /** * 往hbase里面插入一条数据 * @param tableName 表名 * @param rowkey 行键 * @param family 列簇 * @param q 品类 * @param value 出现了多少次 * 2018-12-12_电影 f q 15 * updateStateBykey 对内存要求要一点 * reduceBykey 对内存要求低一点 * hbase: 只有一种数据类型,字节数组 */ @Override public void save(String tableName, String rowkey, String family, String q, long value) { HTableInterface table = getTable(tableName);//获取表对象 try { //incrementColumnValue (英可乐蒙特可伦歪乐)相同的rowkey/family 的列进行value累加API table.incrementColumnValue(rowkey.getBytes(),family.getBytes(),q.getBytes(),value); } catch (Exception e) { e.printStackTrace(); }finally { try { if(table != null){ table.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 根据rowkey返回数据 * @param tableName 表名 * @param rowkey rowkey * @return */ @Override public List<CategoryClickCount> count(String tableName, String rowkey) { ArrayList<CategoryClickCount> list = new ArrayList<CategoryClickCount>(); HTableInterface table = getTable(tableName); //PrefixFilter 前缀过滤器 HBase 支持左匹配 PrefixFilter prefixFilter = new PrefixFilter(rowkey.getBytes()); Scan scan = new Scan();//Scan 扫描仪 scan.setFilter(prefixFilter);//过滤器安装扫描仪中 try { ResultScanner scanner = table.getScanner(scan);//对象 用扫描仪 获取数据 for(Result result:scanner){//遍历scanner 用于一条数据封装成一个对象 for(Cell cell: result.rawCells()){//Cell 单元格(每一个对象看作一个单元格) byte[] date_name = CellUtil.cloneRow(cell);//cloneRow克隆(复制)获取rowkey String name = new String(date_name).split("_")[1]; byte[] value = CellUtil.cloneValue(cell);//cloneValue克隆(复制)获取value long count = Bytes.toLong(value); CategoryClickCount categoryClickCount = new CategoryClickCount(name, count); list.add(categoryClickCount); } } } catch (IOException e) { e.printStackTrace(); }finally { if(table != null){ try { table.close(); } catch (IOException e) { e.printStackTrace(); } } } return list; } }
4、工厂类
package com.aura.dao.factory; import com.aura.dao.HBaseDao; import com.aura.dao.impl.HBaseImpl; //工厂类 public class HBaseFactory { public static HBaseDao getHBaseDao(){ return new HBaseImpl(); } }
5、测试类
package com.aura.Test; import com.aura.bean.CategoryClickCount; import com.aura.dao.HBaseDao; import com.aura.dao.factory.HBaseFactory; import java.util.List; //IDE往集群中HBase中写数据 /* 往hbase里面插入一条数据 * tableName 表名 aura * rowkey 行键 2018-05-23_电影 * family 列簇 f * q 品类 name * value 出现了多少次 10L 20L... */ //测试类 public class Test { public static void main(String[] args) { HBaseDao hBaseDao = HBaseFactory.getHBaseDao(); //往HBase中插入数据 // hBaseDao.save("aura", // "2018-05-23_电影","f","name",10L); // hBaseDao.save("aura", // "2018-05-23_电影","f","name",20L); // hBaseDao.save("aura", // "2018-05-21_电视剧","f","name",11L); // hBaseDao.save("aura", // "2018-05-21_电视剧","f","name",24L); // // hBaseDao.save("aura", // "2018-05-23_电视剧","f","name",110L); // hBaseDao.save("aura", // "2018-05-23_电视剧","f","name",210L); List<CategoryClickCount> list = hBaseDao.count("aura", "2018-05-23"); for(CategoryClickCount cc:list){ System.out.println(cc.getName() + " "+ cc.getCount()); } } }
6、运行结果:运行前要先打打开集群
1)启动zookeeper :zkServer.sh start
2 ) 启动HDFS :start-dfs.sh
3 ) 启动HBbase : ./start-hbase.sh (在hbase的安装目录bin下启动:./[hadoop@hadoop02 bin]$./start-hbase.sh )
4 ) 运行Test 测试类
5 ) 操作hbase 数据命令:hbase shell (这里不用操作)