日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java hbase 批量查询数据_HBase根据Rowkey批量查询数据JAVA API(一次查多条,返回多个记录)...

發布時間:2024/10/6 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java hbase 批量查询数据_HBase根据Rowkey批量查询数据JAVA API(一次查多条,返回多个记录)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在生產中遇到了一個需求,前臺給我多個rowkey的List,要在hbase中查詢多個記錄(返回給前臺list)。在網上也查了很多,不過自己都不太滿意,filter的功能有可能查詢結果不是準確值,而網上給出的get方法也都是返回一條,scan的話都是返回全部數據,還有用rowkey范圍查詢的,都跟我的這個應用場景不符啊。無奈,自己找了一個方法,給各位有同樣需求的朋友們一個參考。

首先創建鏈接屬性:

public?static?Configuration conf =?null;

public?static?Connection connection =?null;

public?static?Admin admin =?null;

static?{

conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum",?"10.120.193.800,10.120.193.810");

conf.set("hbase.master",?"10.120.193.730:60010");

conf.set("hbase.zookeeper.property.clientPort",?"2181");

conf.set("zookeeper.znode.parent",?"/hbase-unsecure");

conf.set("hbase.client.keyvalue.maxsize",?"1048576000");?//1G

conf = HBaseConfiguration.create(conf);

try?{

connection = ConnectionFactory.createConnection(conf);

admin = connection.getAdmin();

}?catch?(IOException e) {

e.printStackTrace();

}

}

緊接著,開始做查詢操作:

public?static?List?qurryTableTest(List rowkeyList)?throws?IOException?{

String tableName =?"table_a";

Table table = connection.getTable( TableName.valueOf(tableName));// 獲取表

for?(String rowkey : rowkeyList){

Get get =?new?Get(Bytes.toBytes(rowkey));

Result result = table.get(get);

for?(Cell kv : result.rawCells()) {

String value = Bytes.toString(CellUtil.cloneValue(kv));

list.add(value);

}

}

return?list;

}

但是!!!重點來了,每條rowkey都要發起一次請求,這種方法效率十分低,測試了10000條記錄查詢要用4分鐘左右,項目需求是秒回啊,這怎么能行?

于是,就自己點開hbase?java?源碼,自己慢慢找,忽然眼前一亮!在HTable.class里看到了這個get方法:

public?Result[] get(List gets)?throws?IOException {

if(gets.size() ==?1) {

return?new?Result[]{this.get((Get)gets.get(0))};

}?else?{

try?{

Object[] r1 =?this.batch(gets);

Result[] results =?new?Result[r1.length];

int?i =?0;

Object[] arr$ = r1;

int?len$ = r1.length;

for(int?i$ =?0; i$ < len$; ++i$) {

Object o = arr$[i$];

results[i++] = (Result)o;

}

return?results;

}?catch?(InterruptedException var9) {

throw?(InterruptedIOException)(new?InterruptedIOException()).initCause(var9);

}

}

}

這就簡單了,緊接著對自己上邊的方法進行改進:

public?static?List?qurryTableTestBatch(List rowkeyList)?throws?IOException?{

List getList =?new?ArrayList();

String tableName =?"table_a";

Table table = connection.getTable( TableName.valueOf(tableName));// 獲取表

for?(String rowkey : rowkeyList){//把rowkey加到get里,再把get裝到list中

Get get =?new?Get(Bytes.toBytes(rowkey));

getList.add(get);

}

Result[] results = table.get(getList);//重點在這,直接查getList

for?(Result result : results){//對返回的結果集進行操作

for?(Cell kv : result.rawCells()) {

String value = Bytes.toString(CellUtil.cloneValue(kv));

list.add(value);

}

}

return?list;

}

根據這種批量的方法,10000個rowkey進行測試,時間為2s,速度提升特別大。

ok!大功告成,成功解決了問題~

總結

以上是生活随笔為你收集整理的java hbase 批量查询数据_HBase根据Rowkey批量查询数据JAVA API(一次查多条,返回多个记录)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。