springboot+hbase整合遇到的坑


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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM