用java API連線HBase
阿新 • • 發佈:2019-01-04
建立maven專案
1、在resource包下匯入 core-site.xml、hbase-site.xml、hdfs-site.xml、log4j.properties 檔案
2、在pom.xml檔案中新增依賴:
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.3.1</version> </dependency> //防止pom.xml檔案報錯,如果pom.xml檔案在加入上面兩個依賴沒有報錯時,可以不要這個依賴 <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>1.6</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency>
Hbase API
1、判斷表是否存在
import org.apache.hadoop.conf.Configuration import org.apache.hadoop.hbase.HBaseConfiguration; public class HbaseDemo { public static Configuration conf; /** * 靜態程式碼塊的特點: * 隨著類的載入而執行,而且只執行一次 * 靜態程式碼塊的執行順序優先於main函式 */ static{ conf = HBaseConfiguration.create(); } /** * 判斷表是否存在 **/ public static boolean isExist(String tableName) { //連線HBase Connection connection = ConnectionFactory.createConnection(conf); //建立管理表物件 Admin admin = conncetion.getAdmin(); return admin.tableExists(TableName.valueOf(tableName)); } public static void main(String[] args){ System.out.println (isExist("aaa")); } }
2、HBase表的建立
public class HbaseDemo { public static Configuration conf; /** * 靜態程式碼塊的特點: * 隨著類的載入而執行,而且只執行一次 * 靜態程式碼塊的執行順序優先於main函式 */ static{ conf = HBaseConfiguration.create(); } /** * Hbase表的建立 **/ public static void createTable(String tableName, String... columnFamily) throws IOException{ //連線HBase Connection connection = ConnectionFactory.createConnection(conf); Admin admin = connection.getAdmin(); //isExist()方法同上一個程式碼塊 //判斷表是否存在,如果存在則不建立,如果不存在則建立表 if (isExist(tableName)) { System.out.println("表已存在!") } else { //建立表描述器 HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName)); //遍歷傳入引數:列族 for(String cf: columnFamily) { //新增列族,new列描述器 htd.addFamily(new HColumnDescriptor(cf)); } //建立表 admin.createTable(htd); } } //主方法測試 public static void main(String[] args){ createTable("staff", "info1", "info2"); } }
3、hbase表的刪除
public class HbaseDemo {
public static Configuration conf;
/**
* 靜態程式碼塊的特點:
* 隨著類的載入而執行,而且只執行一次
* 靜態程式碼塊的執行順序優先於main函式
*/
static{
conf = HBaseConfiguration.create();
}
/**
* Hbase表的刪除
**/
public static void deleteTable(String tableName) throws IOException {
//連線hbase
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
//判斷表是否存在
if(isExist(tableName)) {
//將表置為無效
if (!admin.isTableDisabled(TableName.valueOf(tableName))){
admin.disableTable(TableName.valueOf(tableName));
}
//刪除表
admin.deleteTable(TableName.valueOf(tableName));
System.out.println("表已刪除");
}else {
System.out.println("表不存在");
}
}
//主方法測試
public static void main(String[] args){
deleteTable("staff");
}
}
4、新增一行資料
public class HbaseDemo {
public static Configuration conf;
/**
* 靜態程式碼塊的特點:
* 隨著類的載入而執行,而且只執行一次
* 靜態程式碼塊的執行順序優先於main函式
*/
static{
conf = HBaseConfiguration.create();
}
/**
* 新增一行資料
**/
public static void addRow(String tableName, String rowKey, String cf,
String column, String value) throws IOException {
//連線HBase
Connection connection = ConnectionFactory.createConnection(conf);
Table table = connection.getTable(TableName.valueOf(tableName));
// 判斷表是否存在
//如果表存在
if (isExist(tableName)) {
//new Put物件
Put put = new Put(Bytes.toBytes(rowKey));
//新增列族到put中
put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(column), Bytes.toBytes(value));
//新增資料
table.put(put);
//如果表不存在
}else {
//建立表
createTable(tableName, cf);
Put put = new Put(Bytes.toBytes(rowKey));
put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(column), Bytes.toBytes(value));
table.put(put);
}
System.out.println("資料插入成功");
}
//主方法測試
public static void main(String[] args){
addRow("aaa", "1001", "info1", "name", "nick");
}
}
5、刪除一行資料
public class HbaseDemo {
public static Configuration conf;
/**
* 靜態程式碼塊的特點:
* 隨著類的載入而執行,而且只執行一次
* 靜態程式碼塊的執行順序優先於main函式
*/
static{
conf = HBaseConfiguration.create();
}
/**
* 刪除一行資料
**/
public static void deleteRow(String tableName,String rowKey ,String cf) throws IOException {
//連線HBase
Connection connection = ConnectionFactory.createConnection(conf);
Table table = connection.getTable(TableName.valueOf(tableName));
//new Delete物件
Delete delete = new Delete(Bytes.toBytes(rowKey));
//刪除資料
table.delete(delete);
}
//主方法測試
public static void main(String[] args){
deleteRow("aaa", "1001", null);
}
}
6、刪除多行資料
public class HbaseDemo {
public static Configuration conf;
/**
* 靜態程式碼塊的特點:
* 隨著類的載入而執行,而且只執行一次
* 靜態程式碼塊的執行順序優先於main函式
*/
static{
conf = HBaseConfiguration.create();
}
/**
* 刪除多行資料
**/
public static void deleteRows(String tableName, String... rowKeys) throws IOException {
//連線HBase
Connection connection = ConnectionFactory.createConnection(conf);
Table table = connection.getTable(TableName.valueOf(tableName));
//建立一個泛型為Delete的列表
List<Delete> list = new ArrayList<Delete>();
//遍歷傳入的rowKeys
for(String row: rowKeys) {
//new Delete物件
Delete delete = new Delete(Bytes.toBytes(row));
//將delete物件新增到佇列中
list.add(delete);
}
//刪除資料
table.delete(list);
}
//主方法測試
public static void main(String[] args){
deleteRows("aaa", "1001", "1002");
}
}
7、掃描整張表
public class HbaseDemo {
public static Configuration conf;
/**
* 靜態程式碼塊的特點:
* 隨著類的載入而執行,而且只執行一次
* 靜態程式碼塊的執行順序優先於main函式
*/
static{
conf = HBaseConfiguration.create();
}
/**
* 掃描整張表
**/
public static void getAllRows(String tableName) throws IOException {
//連線HBase
Connection connection = ConnectionFactory.createConnection(conf);
Table table = connection.getTable(TableName.valueOf(tableName));
//new一個scan物件用於掃描全表
Scan scan = new Scan();
ResultScanner resultScanner = table.getScanner(scan);
//遍歷resultScanner物件
for(Result result: resultScanner) {
//將result物件轉換成單元格形式,存放進陣列中
Cell[] cells = result.rawCells();
//遍歷陣列
for(Cell cell:cells) {
//分別得到相關資料
System.out.println("行鍵" + Bytes.toString(CellUtil.cloneRow(cell)));
System.out.println("列族" + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("列" + Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println("值" + Bytes.toString(CellUtil.cloneValue(cell)));
}
}
}
//主方法測試
public static void main(String[] args){
getAllRows("aaa");
}
}
8、得到一個具體的資料
public class HbaseDemo {
public static Configuration conf;
/**
* 靜態程式碼塊的特點:
* 隨著類的載入而執行,而且只執行一次
* 靜態程式碼塊的執行順序優先於main函式
*/
static{
conf = HBaseConfiguration.create();
}
/**
* 得到一個具體的資料
**/
public static void getRow(String tableName, String rowKey) throws IOException {
//連線HBase
Connection connection = ConnectionFactory.createConnection(conf);
Table table = connection.getTable(TableName.valueOf(tableName));
//利用get物件獲取具體資料
Get get = new Get(Bytes.toBytes(rowKey));
Result result = table.get(get);
//將result物件轉換成單元格形式,存放進陣列中
Cell[] cells = result.rawCells();
//遍歷陣列
for(Cell cell : cells) {
//分別得到相關資料
System.out.println("列族" + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("列" + Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println("值" + Bytes.toString(CellUtil.cloneValue(cell)));
}
}
//主方法測試
public static void main(String[] args){
getRow("aaa", "1003");
}
}