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 +
                    ‘}‘;
        }
    }
}
时间: 2024-08-11 09:53:14

Hbase java api的相关文章

Hbase java API 调用详解

Hbase java API 调用 一. hbase的安装 参考:http://blog.csdn.net/mapengbo521521/article/details/41777721 二.hbase访问方式 Native java api:最常规最高效的访问方式. Hbase shell:hbase的命令行工具,最简单的接口,适合管理员使用 Thrift gateway:利用thrift序列化结束支持各种语言,适合异构系统在线访问 Rest gateway:支持rest风格的http api

HBase Java API使用(一)

前言 1. 创建表:(由master完成) 首先需要获取master地址(master启动时会将地址告诉zookeeper)因而客户端首先会访问zookeeper获取master的地址 client和master通信,然后有master来创建表(包括表的列簇,是否cache,设置存储的最大版本数,是否压缩等). 2. 读写删除数据 client与regionserver通信,读写.删除数据 写入和删除数据时讲数据打上不同的标志append,真正的数据删除操作在compact时发生 3. 版本信息

HBase Java API使用

概括 1. 创建.删除及启用禁用表.添加列等都需用到HBaseAdmin,另外需要注意删除,添加列等操作都需要禁用表 2. 表中添加数据,查询等都是和HTable相关,如果是多线程的情况下注意用HTablePool 3.  插入数据使用Put,可以单行添加也可批量添加 4. 查询数据需使用Get,Result,Scan.ResultScanner等 一.HBaseConfiguration org.apache.hadoop.hbase.HBaseConfiguration 对HBase进行配置

hbase java api样例(版本1.3.1,新API)

验证了如下几种java api的使用方法. 1.创建表 2.创建表(预分区) 3.单条插入 4.批量插入 5.批量插入(写缓存) 6.单条get 7.批量get 8.简单scan 具体请参考GitHub. https://github.com/quchunhui/hbase_sample pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave

【Hbase学习之三】Hbase Java API

环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-2.6.5 hbase-0.98.12.1-hadoop2 建立一个java工程 导入hadoop 相关jar导入hbase相关jar 使用客户端(java API)操作hbase 示例一 package hbase; import java.text.SimpleDateFormat; import java.util.ArrayList;

Hbase java API test

依赖: <dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.3.6</version> </dependency> <dependency> <groupId>org.apache.hbase</g

Hbase Java API包括协处理器统计行数

package com.zy; import java.io.IOException; import org.apache.commons.lang.time.StopWatch; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.cli

HBase学习(十一)hbase Java API 介绍及使用示例

几个相关类与HBase数据模型之间的对应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) HTableDescriptor 列族(Column Family) Put 列修饰符(Column Qualifier) Get Scanner 一.HBaseConfiguration 关系:org.apache.hadoop.hbase.HBaseConfiguration 作用:对HBase进

HBase Java API类介绍

几个相关类与HBase数据模型之间的对应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) HTableDescriptor 列族(Column Family) Put 列修饰符(Column Qualifier) Get Scanner 一.HBaseConfiguration 关系:org.apache.hadoop.hbase.HBaseConfiguration 作用:对HBase进