学习
实践
活动
专区
工具
TVP
写文章
专栏首页java,hbasejava连接hbase

java连接hbase

在Windows上作映射 C:\Windows\System32\drivers\etc 更改hosts文件 (小技巧:可能需要权限更改不了,可以将此文件拉到桌面更改保存了再拉回去)

测试声明

我整理的以下代码hbase1-3版本都适用!!!(pom.xml中的版本固定用2.4.13版本)

(本人亲测过hbase-1.7.1,hbase-2.4.13,hbase-3.0.0-alpha-3)

直接上代码

 <dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>2.4.13</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase</artifactId>
            <version>2.4.13</version>
            <type>pom</type>
        </dependency>
    </dependencies>
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.filter.SubstringComparator;
import org.apache.hadoop.hbase.util.Bytes;


import java.io.IOException;

import java.util.*;


public class zsgcHbase {
    public static void main(String[] args) throws IOException {
//        tj();
//        cx();
//        versioncx();
//        sc();
//        jb();
//        fwcx();
//        strRow();
//        filterRow();
        valueCol();
    }
  //连接配置
    public static Connection pz() throws IOException {
        //获取配置
        Configuration conf = HBaseConfiguration.create();
        //指定HBase使用的zookeeper地址,多个用逗号隔开
        conf.set("hbase.zookeeper.quorum", "172.20.10.250:2181,172.20.10.251:2181,172.20.10.252:2181");
        //创建HBase连接,负责对HBase中数据的一些增删改查操作
        Connection conn = ConnectionFactory.createConnection(conf);
        return conn;
    }
 //添加数据和更新数据
    public static void tj() throws IOException {
        Connection conn = pz();
        //获取Table对象,指定要操作的表名(这里需要提前创建好)
        Table table = conn.getTable(TableName.valueOf("test"));
        //指定Rowkey,返回put对象      这里进行批量插入数据再声明一个Put对象再添加一次put对象(也可以声明一个List<Put>集合添加list对象)
        Put put = new Put(Bytes.toBytes("001"));
        //向put对象中指定列族、列、值
        put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"),Bytes.toBytes("zhujuntao"));
        put.addColumn(Bytes.toBytes("info"),Bytes.toBytes("sex"),Bytes.toBytes("man"));
        put.addColumn(Bytes.toBytes("level"),Bytes.toBytes("course"),Bytes.toBytes("qq"));
        //向表中添加数据
        table.put(put);
        //关闭table连接
        table.close();
    }
  //查询根据rowkey查询数据
    public static void cx() throws IOException {
        Connection conn = pz();
        Table table = conn.getTable(TableName.valueOf("test"));
        //指定Rowkey,返回Get对象
        Get get = new Get(Bytes.toBytes("001"));
        //可以在这里指定要查询指定Rowkey数据哪些列族中的列
        // 如果不指定,默认查询指定Rowkey所有列的内容
        //get.addColumn(Bytes.toBytes("info"),Bytes.toBytes("age"));
        //get.addColumn(Bytes.toBytes("info"),Bytes.toBytes("sex"));

        Result result = table.get(get);
        //可以使用listCells()获取所有cell,cell对应的是某一个列的数据
        List<Cell> cells = result.listCells();
        for (Cell cell: cells) {
            //这里获取的信息都是字节类型的,可以通过new String(bytes)转为字符串
            //列族
            byte[] famaily_bytes = CellUtil.cloneFamily(cell);
            //列
            byte[] column_bytes = CellUtil.cloneQualifier(cell);
            //值
            byte[] value_bytes = CellUtil.cloneValue(cell);
            System.out.println("列族:"+new String(famaily_bytes)+",列:"+new String(column_bytes)+",值:"+new String(value_bytes));
        }
        //这里还可以直接使用getValue(family, qualifier)直接获取指定列族中指定列的数据
        //byte[] age_bytes = result.getValue(Bytes.toBytes("info"),Bytes.toBytes("age"));
        table.close();
    }
//查询列值历史版本
    public static void versioncx() throws IOException {
        Connection conn = pz();
        Table table = conn.getTable(TableName.valueOf("test"));
        Get get = new Get(Bytes.toBytes("001"));
        //这里读取cell中的所有历史版本数据
        //可以通过get.readVersions(2)来指定获取多少个历史版本的数据
        get.readAllVersions();

        Result result = table.get(get);

        //获取指定列族中指定列的所有历史版本数据,必须设置get.readAllVersions()或者get.readVersions(2),否则只会获取最新数据
        List<Cell> columnCells = result.getColumnCells(Bytes.toBytes("info"), Bytes.toBytes("name"));
        for (Cell cell :columnCells) {
            byte[] value_bytes = CellUtil.cloneValue(cell);
            long timestamp = cell.getTimestamp();
            System.out.println("值为:"+new String(value_bytes)+",时间戳:"+timestamp);
        }
        table.close();
    }
 //根据rowkey删除数据
    public static void sc() throws IOException {
        Connection conn = pz();
        Table table = conn.getTable(TableName.valueOf("ideatest"));
        //指定Rowkey,返回Delete对象
        Delete delete = new Delete(Bytes.toBytes("laowang"));
        //这里还可以指定要删除指定Rowkey数据哪些列族中的列
        //delete.addColumn(Bytes.toBytes("info"),Bytes.toBytes("age"));

        table.delete(delete);
        table.close();
    }
 //创建表
    public static void jb() throws IOException {
        Connection conn = pz();
        //获取管理权限,负责对HBase中的表进行操作
        Admin admin = conn.getAdmin();
        //指定列族信息
        ColumnFamilyDescriptor familyDesc1 = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("info"))
                //给列族设置属性
                .setMaxVersions(3)//这个是最多存储多少个历史版本数据
                .build();
        ColumnFamilyDescriptor familyDesc2 = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("level"))
                .setMaxVersions(2)
                .build();
        ArrayList<ColumnFamilyDescriptor> familyList = new ArrayList<ColumnFamilyDescriptor>();
        familyList.add(familyDesc1);
        familyList.add(familyDesc2);
        //获取TableDescriptor对象
        TableDescriptor desc = TableDescriptorBuilder.newBuilder(TableName.valueOf("test"))//指定表名
                .setColumnFamilies(familyList)//指定列族
                .build();
        //创建表
        admin.createTable(desc);
    }
    //删除表,先禁用表
    //admin.disableTable(TableName.valueOf("test"));
    //admin.deleteTable(TableName.valueOf("test"));
 //Limit查询前5行
    public static void fwcx() throws IOException {
        Connection conn = pz();
        Table tableRead = conn.getTable(TableName.valueOf("ideatest"));
        //获取Scan对象
        Scan scan = new Scan();
        //同startrow
        //scan.withStartRow(Bytes.toBytes("000"));
        //limit
        scan.setLimit(5);
        //接收scan对象
        ResultScanner scanner = tableRead.getScanner(scan);
        //这里我试了很久,一开始使用上面查询的遍历查询方法结果只能出来第一条后来经过思考就写成以下的方法就行了
        for (Result rs : scanner) {
                System.out.println("行键:"+new String(rs.getRow()));
                Get get = new Get(rs.getRow());
                Result result = tableRead.get(get);
                List<Cell> cells = result.listCells();
                for (Cell cell: cells) {
                byte[] famaily_bytes = CellUtil.cloneFamily(cell);
                byte[] column_bytes = CellUtil.cloneQualifier(cell);
                byte[] value_bytes = CellUtil.cloneValue(cell);
                System.out.println("列族:"+new String(famaily_bytes)+",列:"+new String(column_bytes)+",值:"+new String(value_bytes));
            }
        }
        scanner.close();
        tableRead.close();
    }
  //分页查询,其实跟上边limit一样(上面有提示)
    public static void strRow() throws IOException {
        Connection conn = pz();
        Table tableRead = conn.getTable(TableName.valueOf("ideatest"));
        Scan scan = new Scan();
       scan.withStartRow(Bytes.toBytes("002"),false);   //这里false表示不包含002,默认为true
       scan.withStopRow(Bytes.toBytes("003"),true);
        ResultScanner scanner = tableRead.getScanner(scan);
        for (Result rs : scanner) {
            System.out.println("行键:"+new String(rs.getRow()));
            Get get = new Get(rs.getRow());
            Result result = tableRead.get(get);
            List<Cell> cells = result.listCells();
            for (Cell cell: cells) {
                byte[] famaily_bytes = CellUtil.cloneFamily(cell);
                byte[] column_bytes = CellUtil.cloneQualifier(cell);
                byte[] value_bytes = CellUtil.cloneValue(cell);
                System.out.println("列族:"+new String(famaily_bytes)+",列:"+new String(column_bytes)+",值:"+new String(value_bytes));
            }
        }
        scanner.close();
        tableRead.close();
    }
   //查询rowkey中包含特定前缀的数据
    public static void filterRow() throws IOException {
        Connection conn = pz();
        Table tableRead = conn.getTable(TableName.valueOf("ideatest"));
        Scan scan = new Scan();
        //CompareOperator(EQUAL等于,CREATER大于,CREATE_OR_EQUAL大于或等于,LESS小于,LESS_OR_EQUAL大于或等于,NO_OP误操作,NOT_EQUAL不等于)
        RowFilter filter = new RowFilter(CompareOperator.EQUAL,new SubstringComparator("1"));   //CompareFilter.CompareOp.EQUAL已被弃用,改用CompareOperator.EQUAL
        /*
        FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);    用于存储多个条件
        FilterList.Operator.MUST_PASS_ALL --> 取交集 相当一and操作
        FilterList.Operator.MUST_PASS_ONE --> 取并集 相当于or 操作
         */
        scan.setFilter(filter);
        ResultScanner scanner = tableRead.getScanner(scan);
        for (Result rs : scanner) {
            System.out.println("行键:"+new String(rs.getRow()));
            Get get = new Get(rs.getRow());
            Result result = tableRead.get(get);
            List<Cell> cells = result.listCells();
            for (Cell cell: cells) {
                byte[] famaily_bytes = CellUtil.cloneFamily(cell);
                byte[] column_bytes = CellUtil.cloneQualifier(cell);
                byte[] value_bytes = CellUtil.cloneValue(cell);
                System.out.println("列族:"+new String(famaily_bytes)+",列:"+new String(column_bytes)+",值:"+new String(value_bytes));
            }
        }
        scanner.close();
        tableRead.close();
    }
 //查询行键前缀为0的行    PrefixFilter
    public static void valueCol() throws IOException {
        Connection conn = pz();
        Table tableRead = conn.getTable(TableName.valueOf("ideatest"));
        Scan scan = new Scan();
        scan.setRowPrefixFilter(Bytes.toBytes("0"));
        ResultScanner scanner = tableRead.getScanner(scan);
        for (Result rs : scanner) {
            System.out.println("行键:"+new String(rs.getRow()));
            Get get = new Get(rs.getRow());
            Result result = tableRead.get(get);
            List<Cell> cells = result.listCells();
            for (Cell cell: cells) {
                byte[] famaily_bytes = CellUtil.cloneFamily(cell);
                byte[] column_bytes = CellUtil.cloneQualifier(cell);
                byte[] value_bytes = CellUtil.cloneValue(cell);
                System.out.println("列族:"+new String(famaily_bytes)+",列:"+new String(column_bytes)+",值:"+new String(value_bytes));
            }
        }
        scanner.close();
        tableRead.close();
    }
  //模拟动态分页查询
    public static void strRowT() throws IOException {
        Connection conn = pz();
        Table tableRead = conn.getTable(TableName.valueOf("ideatest"));
        Scan scan = new Scan();
        ResultScanner scanner = null;
        List<String> li = new ArrayList<>();
        System.out.println("请设置页面长度:");
        int x = input.nextInt();
            System.out.println("输入您需要查看的页:");
            int y = input.nextInt();
            for (int i = 0; i < y; i++) {
                if (i == 0) {
                    scan.setLimit(1);
                    scanner = tableRead.getScanner(scan);
                    for (Result r : scanner) {
                        scan.withStartRow(r.getRow());
                    }
                } else {
                    scan.withStartRow(Bytes.toBytes(li.get(li.size() - 1)), false);
                }
                scan.setLimit(x);
                scanner = tableRead.getScanner(scan);
                for (Result rs : scanner) {
                    li.add(new String(rs.getRow()));
                    if (i == y - 1) {
                        System.out.println(new String(rs.getRow()));
                        Get get = new Get(rs.getRow());
                        Result result = tableRead.get(get);
                        List<Cell> cells = result.listCells();
                        for (Cell cell : cells) {
                            byte[] famaily_bytes = CellUtil.cloneFamily(cell);
                            byte[] column_bytes = CellUtil.cloneQualifier(cell);
                            byte[] value_bytes = CellUtil.cloneValue(cell);
                            System.out.print("列族:" + new String(famaily_bytes) + ",列:" + new String(column_bytes) + ",值:" + new String(value_bytes) + "\t\t\t");
                        }
                        System.out.println();
                    }
                }
            }
            scanner.close();
            tableRead.close();
        }
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/m0_73288917?spm=1000.2115.3001.5343复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Java API 连接 Hbase示例

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:https://www.captainai.net/dongk...

    董可伦
  • 如何使用Java连接Kerberos的HBase

    出于CDH集群安全考虑,在CDH集群中增加了Kerberos认证机制。因为HBase的存储系统是基于Hadoop的存储,所以通过HBase客户端访问HBase数...

    Fayson
  • python连接HBase

    hadoop 2.7.0 hbase 1.2.1 Thrift 0.9.0

    py3study
  • IDEA远程连接HBase及其Java API实战

    安全组没开放端口是原罪!!!导致好多BUG费时费力。Hbase悄悄咪咪的用了好多端口,比如被我抓到的42239,直接搜索报错药不对症。

    唔仄lo咚锵
  • 【python 连接hbase】pyth

    如果执行的时候报错: py.parser.exc.ThriftParserError: ThriftPy does not support generati...

    py3study
  • 如何优雅地使用 java 连接 HBase 客户端

    java 远程连接 HBase 客户端,大体分为两种方式。一种是长连接,一种是短连接。

    create17
  • 使用THttpClient连接hbase异常

    - 一般使用TSocket,这里客户使用的是THttpClient,请求url使用的是http://

    stevenxi
  • Java连接HBase的正确方法及Connection创建步骤与详解

    HBASE的连接不像其他传统关系型数据库连接需要维护连接池。HBASE连接若使用错误则会导致随时间推移程序创建的TCP连接过多,导致HBASE连接失败。

    大鹅
  • HBase实战(1):使用Python连接Hbase数据库【未测试】

    下载地址:http://hbase.apache.org/downloads.html

    双面人
  • HBase篇--HBase操作Api和Java操作Hbase相关Api

    Hbase shell启动命令窗口,然后再Hbase shell中对应的api命令如下。

    LhWorld哥陪你聊算法
  • HBase Java Admin API

    HBase 使用 Java 语言开发,因而 HBase 原生提供了一个 Java 语言客户端。这篇文章介绍 HBase Admin API,包括创建、启用、禁用...

    smartsi
  • Java 操作 HBase 教程

    在上一篇文章 HBase 基础入门 中,我们已经介绍了 HBase 的一些基本概念,以及如何安装使用的方法。那么,作为一名 Javaer,自然是希望用 Java...

    美码师
  • HBase使用JavaAPI连接出现java.io.IOException: java.lang.reflect.InvocationTargetException异常解决

    今天在使用JavaAPI连接HBase,运行时出现了这个异常。 zjava.io.IOException: java.lang.refl...

    大数据梦想家
  • HBase Java API 03:HBase与MapReduce整合

    编写MapReduce程序,把"student"表中"info"列族下的"name"那一列抽取出来,存入新HBase表"student_extract"中,要求...

    CoderJed
  • Kettle 7.1 连接HBase数据表

    在Tools -> Hadoop Distribution 中选择 “HortonWorks HDP 2.5.x”。

    kongxx
  • HBase Java编程示例

    一见
  • HBase Java Client API

    在这篇文章中,我们看一下 HBase Java 客户端 API 如何使用。HBase 用 Java 编写,并提供 Java API 与之通信。客户端 API 提...

    smartsi
  • spark踩坑——dataframe写入hbase连接异常

    用户1154259

扫码关注腾讯云开发者

领取腾讯云代金券