HBase 簡單SQL查詢

如何簡化從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查詢語句

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章