如何簡化從hbase中查詢數據
爲了兼容以前從關係型數據庫中查詢數據的接口, 讓hbase可以通過sql語句來查詢其中的數據.
hive有這樣的功能, 他支持通過類似sql語句的語法來操作hbase中的數據, 但是速度太慢了, 因爲hive本身就不是用來查詢數據的, hive是數據倉庫, 做數據分析的, 不適合我們的應用場景.
hbase本身提供的api中, 只有scan是用來查詢數據的, 因此我們需要將sql語句轉成scan 參考<<利用hbase的coprocessor機制來在hbase上增加sql解析引擎–(一)原因&架構>>發現是可行的
因此總體架構爲
sql語句 --sql解析器--> sql語法節點(對象) -> scan -> hbase -> ResultScanner -> List<DynaBean>
例如一個簡單的sql語句
select a, b from table1 where a = 1 and b = 2
我們通過sql解析器可以得到sql語句的各個部分, 再調用hbase api中相應的語句來達到相同的效果
// 要查詢的表 HTable table = new HTable(conf, "table1"); // 要查詢的字段 Scan scan = new Scan(); scan.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("a")); scan.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("b")); // where條件 // a = 1 SingleColumnValueFilter a = new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("a"), CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(1))); filterList.addFilter(filter); // b = 2 SingleColumnValueFilter b = new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("b"), CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(2))); // and FilterList filterList = new FilterList(Operator.MUST_PASS_ALL, a, b); scan.setFilter(filterList);
目前支持的功能
具體細節請參考單元測試
1. 從oracle數據庫中導入表數據到hbase
OracleDataLoader.loadTable("TABLE_NAME", new String[] { "PK_COLUMN_NAME" });
2. 通過SQL語句來查詢hbase中的表數據
List<DynaBean> rows = HbaseQuery.select("SQL");
目前支持的SQL語句
SELECT * FROM report1 /* 查詢所有數據 */ SELECT A, B FROM report1 /* 只查詢某些列 */ SELECT * FROM report1 WHERE A = 1 and B = 2 /* 過濾條件只能是AND邏輯, 而且是等於關係 */ SELECT * FROM report1 limit 3 offset 2 /* 分頁 */
如何使用
1. 在Download中下載最新版的hbase-sql.jar, 將其放在lib中.
注意項目lib的依賴
- commons-beanutils-core-1.8.0.jar
- commons-configuration-1.6.jar
- commons-dbutils-1.5.jar
- commons-lang-2.5.jar
- commons-logging-1.1.1.jar
- hadoop-core-1.0.4.jar
- hbase-0.94.3.jar
- jsqlparser-0.7.0.jar
- log4j-1.2.16.jar
- ojdbc14-10.2.0.5.jar
- protobuf-java-2.4.0a.jar
- slf4j-api-1.4.3.jar
- slf4j-log4j12-1.4.3.jar
- zookeeper-3.4.3.jar
2. 在項目的src中配置好hbase-site.xml, 否則無法連接到hbase來體驗hbase-sql的功能
3. 測試
List<DynaBean> rows = new HbaseQueryImpl().select("select * from report1"); System.out.println(rows.size());
TODO
支持更復雜的SQL查詢語句