import com.yss.utils.BasicPropertites;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.;
 import org.apache.hadoop.hbase.client.;
 import org.apache.hadoop.hbase.io.compress.Compression;
 import org.apache.hadoop.hbase.util.Bytes;import java.io.IOException;
/**
• 没有hbase-site.xml,core-site.xml也可以正常执行
• @author
• @version 2019-03-25 10:25
• describe:Hbase 1.2.1 的操作 ,对于java api操作hbase,直接看这个即可,eclipse上的示例(sxt代码)早已经过时,改方法也适用于hbase0.98版本的
• 方法目录
• create 创建表操作
• delete 删除表操作
• listTables 查看已有表
• put 插入数据,包含批量插入数据
• delete 删除数据
• get 查询数据
 */
 public class HbasePutGetCreateDelete {
private static Configuration configuration;
 private static Connection connection;
 private static Admin admin;
public static void main(String[] args) throws IOException {
 createTable(“t2”,new String[]{“cf1”,“cf2”});
 HbasePutGetCreateDelete.putRow(“t2”, “rw1”, “cf1”, “q1”, “val1”);
 HbasePutGetCreateDelete.getData(“t2”, “rw1”, “cf1”, “q1”);
 HbasePutGetCreateDelete.deleRow(“t2”,“rw1”,“cf1”,“q1”);
 HbasePutGetCreateDelete.deleteTable(“t2”);
 }
/**• 初始化连接
• hbase初始化需要三个对象
• Configuration
• Connection
• Admin
 */
 public static void init(){
 //用HBaseConfiguration类来建立一个Configuration类。Configuration类用于加载需要连接HBase的各项配置。
 configuration = HBaseConfiguration.create();
 configuration.set(“hbase.zookeeper.quorum”,BasicPropertites.zookeeperQuorum());
 configuration.set(“hbase.zookeeper.property.clientPort”,BasicPropertites.zookeeperClientPort());
 configuration.set(“zookeeper.znode.parent”,BasicPropertites.zookeeperParent());
try {
 connection = ConnectionFactory.createConnection(configuration);
 admin = connection.getAdmin();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }/**
• 关闭连接, 关闭的时候需要按照创建的顺序关闭
• Admin
• Connection
 */
 public static void close(){
 try {
 if(null != admin)
 admin.close();
 if(null != connection)
 connection.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }/**
• create 创建表操作
• @param tableNmae 表名
• @param cols 列族,该方法是将列族放在一个数组中,进行遍历
• @throws IOException
 */
 public static void createTable(String tableNmae,String[] cols) throws IOException {
//初始化,建立建立连接,如果应用中需要多次操作hbase,可以将init方法拿出去,只进行一次初始化操作
 init();
//HBase中对表的定义需要用到两个类,一个是定义表名的TableName,另一个是定义表属性的HTableDescriptor。
 //htable=new HTable(conf, TN);//这方法存在安全性的问题,现在已经不建议使用了,通常采用下面的方法
 TableName tableName = TableName.valueOf(tableNmae);
 if(admin.tableExists(tableName)){
 System.out.println(“talbe is exists!”);
 }else {
 HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
 for(String col:cols){
 HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(col);
 /**
 对表的参数设置都在列族这进行设置
 比如把压缩模式修改成GZ,把最大版本数修改为ALL_VERSIONS,ALL_VERSIONS的值其实就是Integer.MAX_VALUE。
 hColumnDescriptor.setCompactionCompressionType(Compression.Algorithm.GZ);
 hColumnDescriptor.setMaxVersions(HConstants.ALL_VERSIONS);
 */hTableDescriptor.addFamily(hColumnDescriptor);
 }
 admin.createTable(hTableDescriptor);}
 close();
 }/**
• delete 删除表操作
• @param tableName 表名
• @throws IOException
 */
 public static void deleteTable(String tableName) throws IOException {
 init();
 TableName tn = TableName.valueOf(tableName);
 if (admin.tableExists(tn)) {
 admin.disableTable(tn);
 admin.deleteTable(tn);
 }
 close();
 }/**
• listTables 查看已有表
• @throws IOException
 */
 public static void listTables() throws IOException {
 init();
 HTableDescriptor hTableDescriptors[] = admin.listTables();
 for(HTableDescriptor hTableDescriptor :hTableDescriptors){
 System.out.println(hTableDescriptor.getNameAsString());
 }
 close();
 }/**
• put 插入数据,包含批量插入数据
• @param tableName 表名
• @param rowkey rowkey
• @param colFamily 列族
• @param col 列名
• @param val 列值
• @throws IOException
 */
 public static void putRow(String tableName,String rowkey,String colFamily,String col,String val) throws IOException {
 init();
 Table table = connection.getTable(TableName.valueOf(tableName));
 Put put = new Put(Bytes.toBytes(rowkey));
 put.addColumn(Bytes.toBytes(colFamily), Bytes.toBytes(col), Bytes.toBytes(val));
 table.put(put);
//批量插入
 // 当一部分数据插入成功,但是另一部分数据插入失败,比如某个RegionServer服务器出现了问题,这时会返回一个IOException,操作会被放弃。不过插入成功的数据不会被回滚,还是成功插入了。
 // 插入失败的重试
 // 对于插入失败的数据,服务器会尝试着再次去插入或者换一个
 // RegionServer,当尝试的次数大于定义的最大次数会抛出
 // RetriesExhaustedWithDetailsException异常,该异常包含了很多错误信息,包括有多少操作失败了,失败的原因以及服务器名和重试的次 数。
 // 如果你定义了错误的列族,则只会尝试一次,因为如果连列族都错了,就没必要再继续尝试下去了
 /* List putList = new ArrayList();
 puts.add(put);
 table.put(putList);*/
 table.close();
 close();
 }/**
• delete 删除数据
• @param tableName
• @param rowkey
• @param colFamily
• @param col
• @throws IOException
/
 public static void deleRow(String tableName,String rowkey,String colFamily,String col) throws IOException {
 init();
 Table table = connection.getTable(TableName.valueOf(tableName));
 Delete delete = new Delete(Bytes.toBytes(rowkey));
 //删除指定列族
//delete.addFamily(Bytes.toBytes(colFamily));
 //删除指定列
//delete.addColumn(Bytes.toBytes(colFamily),Bytes.toBytes(col));
 table.delete(delete);
 //批量删除
 // HBase服务端在调用删除方法的时候,如果成功地执行了一个删除操作,就会把这个删除操作从你传入的deletes列表中删除。
 // 所以你的操作列表会越来越短,如果所有的操作都成功了,你的列表会变空。执行完delete操作后你可以把deletes列表的长度打印出来,你会发现deletes列表的长度变为0了。
 // 如果删除失败了,这个操作还是会保留在delete的传参deletes列表中,并且还同时会抛出一个异常,所以你可以捕捉异常后,再检查删除失败后剩下的这些Delete操作:
 // 然后再对这些剩下的Delete对象进行下一步的操作。
 / List deleteList = new ArrayList();
 deleteList.add(delete);
 table.delete(deleteList);*/
 table.close();
 close();
 }/**
• get 查询数据
• @param tableName
• @param rowkey
• @param colFamily
• @param col
• @throws IOException
 */
 public static void getData(String tableName,String rowkey,String colFamily,String col)throws IOException{
 init();
 Table table = connection.getTable(TableName.valueOf(tableName));
 Get get = new Get(Bytes.toBytes(rowkey));
 //获取指定列族数据
//get.addFamily(Bytes.toBytes(colFamily));
 //获取指定列数据
//get.addColumn(Bytes.toBytes(colFamily),Bytes.toBytes(col));
 Result result = table.get(get);
 //调用方法,获取需要的数据
 showCell(result);
 /**也可以result.getValue
 byte[] value = result.getValue(Bytes.toBytes(colFamily), Bytes.toBytes(col));
 */
table.close();
 close();
 }//格式化输出
 public static void showCell(Result result){
 Cell[] cells = result.rawCells();
 for(Cell cell:cells){
 System.out.println(“RowName:”+new String(CellUtil.cloneRow(cell))+" “);
 System.out.println(“Timetamp:”+cell.getTimestamp()+” “);
 System.out.println(“column Family:”+new String(CellUtil.cloneFamily(cell))+” “);
 System.out.println(“row Name:”+new String(CellUtil.cloneQualifier(cell))+” “);
 System.out.println(“value:”+new String(CellUtil.cloneValue(cell))+” ");
 }
 }}