Hbase java api

本文中使用的是最原始的java api, 没有使用spring-data-hbase,只是使用spring管理Hbase的配置

查询操作分为如下几个步骤:
1. 获取Hbase配置,这里的配置主要指hbase的地址。如果是Zookeeper管理的,可以使用Zookeeper的地址和端口
2. 根据配置获取Hbase连接:
connection = ConnectionFactory.createConnection(this.hbaseConfig.gethBaseConfiguration())
3. 根据Hbase连接,获取HTable。
HTable hTable = (HTable) connection.getTable(TableName.valueOf(tableName));
4. 查询。多行查询(Scan方式)和单行查询(Get方式)
示例代码为scan方式


scan.setStartRow(Bytes.toBytes(startRow));  scan.setStopRow(Bytes.toBytes(endRow));  scan.setCaching(4000);  scan.setBatch(3);  //设置列族 //        scan.addFamily(Bytes.toBytes(columnFamily));  // 设置列  scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes("createtime"));  scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes("lat"));  scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes("lon"));
5. 获取查询数据,以scan为例
resultScanner = hTable.getScanner(scan);

6. 获取Cell中的数据


for (Result result : resultScanner) {
    RwwData rwwData = new RwwData();  for (Cell cell : result.rawCells()) {
        String k = Bytes.toString(CellUtil.cloneQualifier(cell));  String v = Bytes.toString(CellUtil.cloneValue(cell));    } }





其中:
CellUtil.cloneQualifier(cell)
获取的是每一列的名称。
CellUtil.cloneValue(cell)
获取的是每一列的名称对应的值。

HbaseConfig


public class HbaseConfig {
    private static String zookeeperAddr = "";
    private static String zookeeperPoot = "2181";
    private static int zkRetry = 2;

    private static Configuration hBaseConfiguration = null;

    static {
        if (hBaseConfiguration == null) {
            Configuration configuration = new Configuration();
            configuration.set("hbase.zookeeper.quorum", zookeeperAddr);
            configuration.set("hbase.zookeeper.property.clientPort", zookeeperPoot);
            configuration.setInt("hbase.client.retries.number", zkRetry);
            hBaseConfiguration = HBaseConfiguration.create(configuration);
        }
    }

    public static Configuration gethBaseConfiguration() {
        return hBaseConfiguration;
    }

    public void setZookeeperAddr(String zookeeperAddr) {
        this.zookeeperAddr = zookeeperAddr;
    }

    public void setZookeeperPoot(String zookeeperPoot) {
        this.zookeeperPoot = zookeeperPoot;
    }

    public void setZkRetry(int zkRetry) {
        this.zkRetry = zkRetry;
    }
}




HbaseConnection


public class HbaseConnection {

    private static Connection connection = null;
    private static HbaseConfig hbaseConfig;

    static {
        if (connection == null) {
            try {
                connection = ConnectionFactory.createConnection(hbaseConfig.gethBaseConfiguration());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static Connection getConnection() {
        return connection;
    }

    public void setHbaseConfig(HbaseConfig hbaseConfig) {
        this.hbaseConfig = hbaseConfig;
    }
}





HbaseService


public class HbaseService {

    private Logger logger = LoggerFactory.getLogger(HbaseService.class);
    private final long BASE = 2147483647;
    private HbaseConnection hbaseCcnnection;

    /**
     * @param tableName        : 表名
     * @param columnFamily:列族
     * @param phone:手机号
     * @param beginTime:查询开始时间
     * @param endTime:查询结束时间
     * @return
     * @throws IOException
     */
    public List<GeoPoint> getGeoPoints(final String tableName, final String columnFamily
            , String phone, long beginTime, long endTime)
            throws IOException, InvocationTargetException, IllegalAccessException, ParseException {
        List<GeoPoint> geoPointList = new ArrayList<>();
        Connection connection = HbaseConnection.getConnection();

        HTable hTable = (HTable) connection.getTable(TableName.valueOf(tableName));
        //构建scan
        Scan scan = new Scan();
        String startRow = this.getRowKey(phone, endTime);
        String endRow = this.getRowKey(phone, beginTime);

        System.out.println(startRow + " : " + endRow);
        scan.setStartRow(Bytes.toBytes(startRow));
        scan.setStopRow(Bytes.toBytes(endRow));
        scan.setCaching(4000);
        scan.setBatch(3);
        //设置列族
//        scan.addFamily(Bytes.toBytes(columnFamily));
        // 设置列
        scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes("createtime"));
        scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes("lat"));
        scan.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes("lon"));
        ResultScanner resultScanner = null;

        List<RwwData> rowDataList = new ArrayList<>();
        //获取坐标点
        try {
            resultScanner = hTable.getScanner(scan);
            for (Result result : resultScanner) {
                System.out.println("result: " + result);
                RwwData rwwData = new RwwData();
                System.out.println("rawCelles" + result.rawCells());
                for (Cell cell : result.rawCells()) {
                    String k = Bytes.toString(CellUtil.cloneQualifier(cell));
                    String v = Bytes.toString(CellUtil.cloneValue(cell));
                    rwwData.set(k, v);

                }
                System.out.println(rwwData);
                rowDataList.add(rwwData);
            }
        } catch (Exception e) {
            logger.error("从Hbase中获取坐标点信息出错", e);
            e.printStackTrace();
        } finally {
            resultScanner.close();
        }

        System.out.println("【rowDataList : 】" + rowDataList.size());
        System.out.println(rowDataList);

        if (rowDataList.size() > 0) {
            //按照时间升序排序
            Collections.sort(rowDataList);
            System.out.println("【rowDataList sort : 】" + rowDataList);
//            GeoPoint geoPoint = new GeoPoint();
            for (RwwData rwwData : rowDataList) {
                GeoPoint geoPoint = new GeoPoint();
//                BeanUtils.copyProperties(geoPoint, rwwData);
                geoPoint.x = rwwData.lat; //维度
                geoPoint.y = rwwData.lon; //经度
                geoPointList.add(geoPoint);

            }
        }
        System.out.println(geoPointList);
        return geoPointList;
    }

    /**
     * phone+(2147483647-指定时间秒数)
     *
     * @param phone
     * @param time
     * @return
     * @throws ParseException
     */
    private String getRowKey(String phone, long time) throws ParseException {
//        long phoneNum = NumberUtils.toLong(phone);
//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        long timeMillSeconds = format.parse(time).getTime();
        long result = this.BASE - time / 1000;
        return phone + result;
    }

    /**
     *
     */
    private class RwwData implements Comparable<RwwData> {
        private String createtime;
        private double lat; //维度,lat
        private double lon; //经度,lon

        //可以使用反射啊,用最简单的
        public void set(String k, String value) throws NoSuchFieldException, IllegalAccessException {
            Preconditions.checkArgument(StringUtils.isNotBlank(k));
            Preconditions.checkArgument(value != null);
            Field f = RwwData.class.getDeclaredField(k);
            f.setAccessible(true);
            f.set(this, value);
//            if (StringUtils.equals("createtime", k)) {
//                this.createtime = String.valueOf(value);
//            } else if (StringUtils.equals("lat", k)) {
//                this.x = Double.parseDouble(value); //维度
//            } else if (StringUtils.equals("lon", k)) {
//                this.y = Double.parseDouble(value); //经度
//            } else {
//                throw new IllegalArgumentException(" no properties " + k + " found");
//            }

        }

        @Override
        public int compareTo(RwwData o) {
            return this.createtime.compareTo(o.createtime);
        }

        public double getLon() {
            return lon;
        }

        public void setLon(double lon) {
            this.lon = lon;
        }

        public double getLat() {
            return lat;
        }

        public void setLat(double lat) {
            this.lat = lat;
        }

        public String getCreatetime() {
            return createtime;
        }

        public void setCreatetime(String createtime) {
            this.createtime = createtime;
        }

        @Override
        public String toString() {
            return "RwwData{" +
                    "createtime='" + createtime + '\'' +
                    ", lat=" + lat +
                    ", lon=" + lon +
                    '}';
        }
    }

    public class GeoPoint {

        private double x;
        private double y;
        private double xyy;
        private double yx;
        private String fyx;

        public double getX() {
            return x;
        }

        public void setX(double x) {
            this.x = x;
        }

        public double getY() {
            return y;
        }

        public void setY(double y) {
            this.y = y;
        }

        public double getXyy() {
            return xyy;
        }

        public void setXyy(double xyy) {
            this.xyy = xyy;
        }

        public double getYx() {
            return yx;
        }

        public void setYx(double yx) {
            this.yx = yx;
        }

        public String getFyx() {
            return fyx;
        }

        public void setFyx(String fyx) {
            this.fyx = fyx;
        }

        @Override
        public String toString() {
            return "GeoPoint{" +
                    "x=" + x +
                    ", y=" + y +
                    '}';
        }
    }
}






转载于:https://my.oschina.net/u/1011659/blog/524802

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值