Hbase的javaAPI操作
首先需要导入依赖的jar包,把解压hbase目录中的
/root/training/hbase-2.2.0/lib中所有的jar包和
/root/training/hbase-2.2.0/lib/client-facing-thirdparty下的所有jar导入到你开发hbase的工程文件当中
注意几点
一、因为客户端是通过client连接zookeeper来操作hbase,而client从zookeeper中获取到的连接主机的是主机名不是ip地址,所以我们需要在windows中host文件中配置主机名对应的ip地址
二、所有hbase都是基于对象编程的,比如创建数据库,创建数据表,添加数据
三、hbase中没有数据类型,所有的数据都是二进制,所以当我们添加列或创建表的是写表明都需要把字符串转换成二进制
程序实例
创建表
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.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Get;
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.client.Table;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;
public class HbaseDDLDML
{
@Test
public void createTable() throws Exception {
//添加配置、创建一个链接
Configuration conf=HBaseConfiguration.create();
//设置zookeeper地址
conf.set("hbase.zookeeper.quorum", "192.168.112.111");
//通过工厂对象拿到一个链接
Connection client = ConnectionFactory.createConnection(conf);
//获取管理对象
Admin admin = client.getAdmin();
//创建一个table构造器并添加表名
TableDescriptorBuilder builder=TableDescriptorBuilder.newBuilder(TableName.valueOf("mystudent"));
//添加列族
//单行构建和批量构建够可以
/*builder.setColumnFamily(ColumnFamilyDescriptorBuilder.of("info"));
builder.setColumnFamily(ColumnFamilyDescriptorBuilder.of("grade"));*/
List<ColumnFamilyDescriptor> columns=new ArrayList<>();
columns.add(ColumnFamilyDescriptorBuilder.of("info"));
columns.add(ColumnFamilyDescriptorBuilder.of("grade"));
builder.setColumnFamilies(columns);
//创建表
admin.createTable(builder.build());
//关闭链接
admin.close();
client.close();
}
//添加数据
@Test
public void insert() {
Configuration conf=HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.112.111");
//通过配置获取一个链接
Connection connection=null;
Table table =null;
try
{
//通过配置获取一个链接
connection = ConnectionFactory.createConnection(conf);
//通过链接获取一个table
table = connection.getTable(TableName.valueOf("mystudent"));
//然后在构建一个put对象,每行数据都是一个Put对象,创建行健的时候是通过行健创建的
Put put=new Put(Bytes.toBytes("s001"));
put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"), Bytes.toBytes("Tom"));
put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("sex"), Bytes.toBytes("man"));
put.addColumn(Bytes.toBytes("grade"),Bytes.toBytes("yuwen"), Bytes.toBytes("89"));
table.put(put);
} catch (Exception e)
{
e.printStackTrace();
}finally {
try
{
table.close();
connection.close();
} catch (Exception e2)
{
e2.printStackTrace();
}
}
}
//获取数据
@Test
public void testGet() {
Configuration conf=HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.112.111");
//通过配置获取一个链接
Connection connection=null;
Table table =null;
try
{
//通过配置获取一个链接
connection = ConnectionFactory.createConnection(conf);
//通过链接获取一个table
table = connection.getTable(TableName.valueOf("mystudent"));
//构造一个get对象
Get get=new Get(Bytes.toBytes("s001"));
//指定返回列,如果不指定返回列那么就是返回正行的数据
get.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
get.addColumn(Bytes.toBytes("grade"), Bytes.toBytes("yuwen"));
Result result = table.get(get);
System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("grade"), Bytes.toBytes("yuwen"))));
} catch (Exception e)
{
e.printStackTrace();
}finally {
try
{
table.close();
connection.close();
} catch (Exception e2)
{
e2.printStackTrace();
}
}
}
//获取整张表的数据scan “mystudent”相当于select * from mystudent
@Test
public void testScan() {
Configuration conf=HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.112.111");
//通过配置获取一个链接
Connection connection=null;
Table table =null;
try
{
//通过配置获取一个链接
connection = ConnectionFactory.createConnection(conf);
//通过链接获取一个table
table = connection.getTable(TableName.valueOf("mystudent"));
//构造一个scan对象,表扫描器,可以添加过滤条,可以单独添加也可以在构造对象中添加
Scan scan=new Scan();
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner)
{
System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("grade"), Bytes.toBytes("yuwen"))));
}
//构造一个有get的scan对象
Get get=new Get(Bytes.toBytes("s001"));
//指定返回列,如果不指定返回列那么就是返回正行的数据
get.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
get.addColumn(Bytes.toBytes("grade"), Bytes.toBytes("yuwen"));
Scan scan1=new Scan(get);
ResultScanner scanner1 = table.getScanner(scan1);
for (Result result : scanner1)
{
System.out.println("scanner1:"+Bytes.toString(result.getValue(Bytes.toBytes("grade"), Bytes.toBytes("yuwen"))));
}
} catch (Exception e)
{
e.printStackTrace();
}finally {
try
{
table.close();
connection.close();
} catch (Exception e2)
{
e2.printStackTrace();
}
}
}
//删除一张表,drop属于ddl语句,所以不是基于表上的操作,所以使用管理用户操作
@Test
public void testDrop() {
Configuration conf=HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.112.111");
//通过配置获取一个链接
Connection connection=null;
try
{
//通过配置获取一个链接
connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
admin.disableTable(TableName.valueOf("mystudent"));
admin.deleteTable(TableName.valueOf("mystudent"));
} catch (Exception e)
{
e.printStackTrace();
}finally {
try
{
connection.close();
} catch (Exception e2)
{
e2.printStackTrace();
}
}
}
}
通过代码中可以看出如果是属于ddl语句的,我们通过链接获取的是管理用户来操作
如果是dml语句的话,我们通过链接获取的是表,通过表来进行操作
Scan的构造有多种方法。