前些日子,搞了一波Hbase數據庫的整合,個人感覺hbase 還不錯,大概的介紹和理解,網上很多,但是對Hbase分頁以及使用sql查詢的整合還是比較少的,最后我也沒搞成分頁,因為服務器不讓我動,我想上Phoneix插件,項目負責人不給弄啊!~~~
1.報錯無權限,在初始化Hbase連接的時候,添加下面的代碼,admin 是安裝hbase機器的用戶名。
org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 1 action: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user ‘xxxx'
/*
* 在創建、查詢、插入的時候會報錯,當前用戶沒有權限
* 添加下面一行代碼,把hbase已經存在的用戶 存放在代碼中
* 調用的時候就不會報錯
* */
UserGroupInformation userGroupInformation = UserGroupInformation.createRemoteUser("admin");
connection = ConnectionFactory.createConnection(conf, pool, User.create(userGroupInformation));
2.查詢的時候添加條件
/**
* 根據某個列查詢
* @param tablename 表名
* @param columnFamily 列族
* @param vehicleId 列名
* @param vehplatecolorid 列名
* @param startDate 開始時間
*@param startDate 結束時間
* */
public static String selectByParam(String tablename, String columnFamily, String vehicleId, String param1,
String vehplatecolorid,String param2,Long startDate,Long endDate ) throws Exception {
//過濾器
Filter filter1 = new SingleColumnValueFilter(Bytes.toBytes(columnFamily), Bytes.toBytes(vehicleId),
CompareFilter.CompareOp.EQUAL, Bytes.toBytes(param1));
Filter filter2 = new SingleColumnValueFilter(Bytes.toBytes(columnFamily), Bytes.toBytes(vehplatecolorid),
CompareFilter.CompareOp.EQUAL, Bytes.toBytes(param2));
/*Filter filter3 = new SingleColumnValueFilter(Bytes.toBytes(columnFamily), Bytes.toBytes(startDate),
CompareFilter.CompareOp.LESS_OR_EQUAL , Bytes.toBytes(startDate));
Filter filter4 = new SingleColumnValueFilter(Bytes.toBytes(columnFamily), Bytes.toBytes(endDate),
CompareFilter.CompareOp. GREATER_OR_EQUAL, Bytes.toBytes(endDate));*/
FilterList filterList = new FilterList();
filterList.addFilter(filter1);
filterList.addFilter(filter2);
/*filterList.addFilter(filter3);
filterList.addFilter(filter4);*/
Table table = connection.getTable(TableName.valueOf(tablename));
Scan s = new Scan();
if(startDate!=null && endDate !=null){
//時間戳篩選
s.setTimeRange(startDate,endDate);
}
s.setFilter(filterList);
ResultScanner rs = table.getScanner(s);
List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
//此處雙for循環 需要優化,但沒找到其他 讀取數據的方式^-^ 只能雙循環讀取啊 <'_'> .....
for (Result r : rs) {
Map map=new HashMap();
for (KeyValue keyValue : r.raw()) {
map.put(new String(keyValue.getQualifier()),new String(keyValue.getValue()));
}
if(map.get("passId")!=null && map.get("vehicleId")!=null){
resList.add(map);
}
}
return JSON.toString(resList);
}
