HBase的Java API操做

Java API操做

一、導jar包

    導入開發包。java

    將hbase安裝包中lib下全部jar包導入java項目。正則表達式

二、API

java類數據庫

HBase數據模型api

HBaseAdmin安全

數據庫(DataBase)服務器

HBaseConfigurationdom

HTable異步

表(Table)函數

HTableDescriptorspa

列族(Column Family)

Put

列修飾符(Column Qualifier)

Get

Scanner

 

1.HBaseAdmin

提供了一個接口來管理HBase數據庫的表信息。它提供的方法包括:建立表,刪除表,列出表項,使表有效或無效,以及添加或刪除表列族成員等。

返回值

函數

描述

void

addColumn(String tableName, HColumnDescriptor column)

向一個已經存在的表添加咧

checkHBaseAvailable(HBaseConfiguration conf)

靜態函數,查看HBase是否處於運行狀態

createTable(HTableDescriptor desc)

建立一個表,同步操做

deleteTable(byte[] tableName)

刪除一個已經存在的表

enableTable(byte[] tableName)

使表處於有效狀態

disableTable(byte[] tableName)

使表處於無效狀態

HTableDescriptor[]

listTables()

列出全部用戶控件表項

void

modifyTable(byte[] tableName, HTableDescriptor htd)

修改表的模式,是異步的操做,可能須要花費必定的時間

boolean

tableExists(String tableName)

檢查表是否存在

用法示例:

HBaseAdmin admin = new HBaseAdmin(config);
admin.disableTable("tablename")

2.HBaseConfiguration

對HBase進行配置。

返回值

函數

描述

void

addResource(Path file)

經過給定的路徑所指的文件來添加資源

void

clear()

清空全部已設置的屬性

string

get(String name)

獲取屬性名對應的值

String

getBoolean(String name, boolean defaultValue)

獲取爲boolean類型的屬性值,若是其屬性值類型部位boolean,則返回默認屬性值

void

set(String name, String value)

經過屬性名來設置值

void

setBoolean(String name, boolean value)

設置boolean類型的屬性值

示例:

HBaseConfiguration hconfig = new HBaseConfiguration();
hconfig.set("hbase.zookeeper.property.clientPort","2181");

    該方法設置了"hbase.zookeeper.property.clientPort"的端口號爲2181。通常狀況下,HBaseConfiguration會使用構造函數進行初始化,而後在使用其餘方法。

3.HTable

    能夠用來和HBase表直接通訊。此方法對於更新操做來講是非線程安全的。

返回值

函數

描述

void

checkAdnPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put

自動的檢查row/family/qualifier是否與給定的值匹配

void

close()

釋放全部的資源或掛起內部緩衝區中的更新

Boolean

exists(Get get)

檢查Get實例所指定的值是否存在於HTable的列中

Result

get(Get get)

獲取指定行的某些單元格所對應的值

byte[][]

getEndKeys()

獲取當前一打開的表每一個區域的結束鍵值

ResultScanner

getScanner(byte[] family)

獲取當前給定列族的scanner實例

HTableDescriptor

getTableDescriptor()

獲取當前表的HTableDescriptor實例

byte[]

getTableName()

獲取表名

static boolean

isTableEnabled(HBaseConfiguration conf, String tableName)

檢查表是否有效

void

put(Put put)

向表中添加值

用法示例:

HTable table = new HTable(conf, Bytes.toBytes(tablename));
ResultScanner scanner =  table.getScanner(family);

4.HTableDescriptor

    包含了表的名字極其對應表的列族。

返回值

函數

描述

void

addFamily(HColumnDescriptor)

添加一個列族

HColumnDescriptor

removeFamily(byte[] column)

移除一個列族

byte[]

getName()

獲取表的名字

byte[]

getValue(byte[] key)

獲取屬性的值

void

setValue(String key, String value)

設置屬性的值

    用法示例:

HTableDescriptor htd = new HTableDescriptor(table);
htd.addFamily(new HcolumnDescriptor("family"));

5.HColumnDescriptor

    維護着關於列族的信息,例如版本號,壓縮設置等。它一般在建立表或者爲表添加列族的時候使用。列族被建立後不能直接修改,只能經過刪除而後從新建立的方式。列族被刪除的時候,列族裏面的數據也會同時被刪除。

返回值

函數

描述

byte[]

getName()

獲取列族的名字

byte[]

getValue(byte[] key)

獲取對應的屬性的值

void

setValue(String key, String value)

設置對應屬性的值

    用法示例:

HTableDescriptor htd = new HTableDescriptor(tablename);
HColumnDescriptor col = new HColumnDescriptor("content:");
htd.addFamily(col);

6.Put

    用來對單個行執行添加操做。

返回值

函數

描述

Put

add(byte[] family, byte[] qualifier, byte[] value)

將指定的列和對應的值添加到Put實例中

Put

add(byte[] family, byte[] qualifier, long ts, byte[] value)

將指定的列和對應的值及時間戳添加到Put實例中

byte[]

getRow()

獲取Put實例的行

RowLock

getRowLock()

獲取Put實例的行鎖

long

getTimeStamp()

獲取Put實例的時間戳

boolean

isEmpty()

檢查familyMap是否爲空

Put

setTimeStamp(long timeStamp)

設置Put實例的時間戳

    用法示例:

HTable table = new HTable(conf,Bytes.toBytes(tablename));
Put p = new Put(brow);//爲指定行建立一個Put操做
p.add(family,qualifier,value);
table.put(p);

7.Get

    用來獲取單個行的相關信息。

返回值

函數

描述

Get

addColumn(byte[] family, byte[] qualifier)

獲取指定列族和列修飾符對應的列

Get

addFamily(byte[] family)

經過指定的列族獲取其對應列的全部列

Get

setTimeRange(long minStamp,long maxStamp)

獲取指定取件的列的版本號

Get

setFilter(Filter filter)

當執行Get操做時設置服務器端的過濾器

    用法示例:

HTable table = new HTable(conf, Bytes.toBytes(tablename));
Get g = new Get(Bytes.toBytes(row));

8.Result

    存儲Get或者Scan操做後獲取表的單行值。使用此類提供的方法能夠直接獲取值或者各類Map結構(key-value對)。

返回值

函數

描述

boolean

containsColumn(byte[] family, byte[] qualifier)

檢查指定的列是否存在

NavigableMap<byte[],byte[]>

getFamilyMap(byte[] family)

獲取對應列族所包含的修飾符與值的鍵值對

byte[]

getValue(byte[] family, byte[] qualifier)

獲取對應列的最新值

9.ResultScanner

    客戶端獲取值的接口。

返回值

函數

描述

void

close()

關閉scanner並釋放分配給它的資源

Result

next()

獲取下一行的值

案例

1>建立表

@Test
	public void create() throws Exception {
		//建立配置文件
		Configuration configuration=HBaseConfiguration.create();
		//設置配置文件信息
		configuration.set("hbase.zookeeper.quorum", "yun01:2181,yun02:2181,yun03:2181");
		//建立數據庫對象
		HBaseAdmin admin=new HBaseAdmin(configuration);
		//建立表對象
		HTableDescriptor hd=new HTableDescriptor(TableName.valueOf("tab02".getBytes()));
		//建立列族對象
		HColumnDescriptor hc1=new HColumnDescriptor("cf01".getBytes());
		//設置列族保存最大歷史版本
		hc1.setMaxVersions(3);
		HColumnDescriptor hc2=new HColumnDescriptor("cf02".getBytes());
		hc2.setMaxVersions(3);
		hd.addFamily(hc1);
		hd.addFamily(hc2);
		//建立表
		admin.createTable(hd);
		//關閉鏈接
		admin.close();
	}

2>插入數據

@Test
	public void Insert() throws Exception {
		// 建立配置文件
		Configuration conf = HBaseConfiguration.create();
		// 設置配置文件信息
		conf.set("hbase.zookeeper.quorum", "yun01:2181,yun02:2181,yun03:2181");
		// 建立表對象
		HTable table = new HTable(conf, "tab02".getBytes());
		// 建立添加數據的行鍵對象
		Put put = new Put("row01".getBytes());
		// 設置行鍵數據
		put.add("cf01".getBytes(), "c01".getBytes(), "wz001".getBytes());
		put.add("cf02".getBytes(), "c01".getBytes(), "wz0010".getBytes());
		put.add("cf01".getBytes(), "c02".getBytes(), "wz010".getBytes());
		// 添加數據
		table.put(put);
		// 關閉鏈接
		table.close();
	}

    javaapi操做hbase時,入口類爲HTable,此對象建立時須要掃描.META表,以及其餘操做,這很是耗時,因此,應該將該對象設置爲單例,複用該對象,若是須要多個HTable對象,應該使用HTablePool,經過對象池複用對象。

HTablePool pool = new HTablePool(conf,10);//不知道爲何過期了?

    hbase全部修改數據的操做都保證了行級別的原子性,

試驗

    一次插入100萬條數據。

@Test
	public void insertMach() throws Exception{
		Configuration conf=HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "yun01:2181,yun03:2181,yun02:2181,");
		HTable table = new HTable(conf, "tab02".getBytes());
		List<Put> pList=new ArrayList<Put>();
		for (int i = 1; i <= 1000000; i++) {
			Put put = new Put(Bytes.toBytes("row"+i));
			put.add("cf01".getBytes(), Bytes.toBytes("c"), Bytes.toBytes("val"+i));
			pList.add(put);
			if(i%10000==0) {
				table.put(pList);
				pList=new ArrayList<Put>();
			}
		}
		table.put(pList);
		table.close();
	}

    HBase遍歷查詢百萬數據的時間以下:

    大概時間爲3-4分鐘。

3>獲取數據

@Test
	public void select() throws Exception {
		// 建立配置文件對象
		Configuration conf = HBaseConfiguration.create();
		// 設置配置文件參數
		conf.set("hbase.zookeeper.quorum", "yun01:2181,yun02:2181,yun03:2181,");
		// 建立表對象
		HTable table = new HTable(conf, "tab02".getBytes());
		// 建立獲取數據的行鍵對象
		Get get = new Get("row01".getBytes());
		// 獲取整行數據
		Result result = table.get(get);
		// 獲取行數據值
		byte[] bs = result.getValue("cf01".getBytes(), "c01".getBytes());
		// 轉化數據
		String string = new String(bs);
		System.err.println(string);
		// 關閉鏈接
		table.close();
	}

4>獲取數據集

@Test
	public void resultList() throws Exception{
		// 建立配置文件對象並配置參數
		Configuration conf=HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "yun01:2181,yun02:2181,yun03:2181");
		// 建立表對象
		HTable table = new HTable(conf, "tab02".getBytes());
		// 建立獲取數據的行鍵對象
		Scan scan = new Scan("row01".getBytes());
		// 獲取結果集
		ResultScanner scanner = table.getScanner(scan);
		// 遍歷結果集
		Iterator<Result> it = scanner.iterator();
		while(it.hasNext()) {
			Result result = it.next();
			byte[] bs = result.getValue("cf01".getBytes(), "c01".getBytes());
			String str=new String(bs);
			System.err.println(str);
		}
		// 關閉鏈接
		table.close();
	}

5>刪除數據

@Test
	public void delete() throws Exception{
		//建立配置文件對象並配置參數
		Configuration conf=HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "yun01:2181,yun02:2181,yun03:2181");
		// 建立表對象
		HTable table = new HTable(conf, "tab02".getBytes());
		// 建立刪除對象
		Delete delete = new Delete("row1".getBytes());
		// 刪除數據
		table.delete(delete);
		// 關閉鏈接
		table.close();
	}

6>刪除表

@Test
	public void deleteTable() throws Exception{
		// 建立配置文件對象並配置參數
		Configuration conf= HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "yun01:2181,yun02:2181,yun03:2181");
		// 建立數據庫對象
		HBaseAdmin admin = new HBaseAdmin(conf);
		// 禁用表
		admin.disableTable("tab01".getBytes());
		// 刪除表
		admin.deleteTable("tab01".getBytes());
		// 關閉鏈接
		admin.close();
	}

三、HBase的高級查詢

1.實現範圍查詢

    若是隻設置scan可是不作任何限制,則查詢全部數據。

Scan scan = new Scan();

    若是設置scan而且設置scan的掃描開始和結束爲止則查詢範圍數據,注意含頭不含尾。

Scan scan = new Scan();
scan.setStartRow("rk2".getBytes());
scan.setStopRow("rk4".getBytes());

2.過濾器實現過濾查詢

    在scan上提供了方法來實現過濾查詢。

Scan scan = new Scan();
Filter filter = ...
scan.setFilter(filter)

1>Hbase內置器

HBase爲篩選數據提供了一組過濾器,經過這個過濾器能夠在HBase中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操做,也就是說過濾器最終可以篩選的數據可以細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。

案例

Filter filter = new RowFilter(CompareOp.GREATER_OR_EQUAL,new BinaryComparator("rk3".getBytes()));

//--RowFilter配合正則過濾器 能夠經過正則表達式從hbase表中篩選全部行鍵符合正則的數據

!!Filter filter = new RowFilter(CompareOp.EQUAL,new RegexStringComparator("^[^x]*x[^x]*$"));

Filter filter = new PrefixFilter("rkx".getBytes());

Filter filter = new KeyOnlyFilter();

Filter filter = new RandomRowFilter(0.2f);

Filter filter = new InclusiveStopFilter("rk4".getBytes());

Filter filter = new FirstKeyOnlyFilter();

//--ColumnPrefixFilter能夠實現按照列的前綴過濾數據

!!Filter filter = new ColumnPrefixFilter("c2".getBytes());

//--ValueFilter能夠按照值來過濾數據

!!Filter filter = new ValueFilter(CompareOp.EQUAL,new RegexStringComparator("^[^2]*2.*$"));

//--SingleColumnValueFilter按照某一個指定列的值決定該行是否返回

!!Filter filter = new SingleColumnValueFilter("cf1".getBytes(), "c1".getBytes(), CompareOp.EQUAL, new RegexStringComparator("^[^3]*3.*$"));

//--FilterList 能夠將多個過濾器的效果合併起做用

!!Filter f1 = new RowFilter(CompareOp.EQUAL,new RegexStringComparator("^rk\\d+$"));

!!Filter f2 = new KeyOnlyFilter();

!!FilterList fl = new FilterList(Operator.MUST_PASS_ALL, f1,f2);

scan.setFilter(fl);

 

上一篇:HBase的Java API操做

相關文章
相關標籤/搜索