前些日子,搞了一波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); }