搜索
首页数据库mysql教程hbase Java API操作实例
hbase Java API操作实例Jun 07, 2016 pm 04:41 PM
apiddlhbasejava创建删除实例操作

DDL(创建及删除表格) 如何在Hbase中创建表格以及删除表格。可通过Java和Hbase Shell两种方法实现。 创建表格 HBase中表格的创建是通过对操作HBaseAdmin这一对象使其调用createTable()这一方法来实现。 其中HTableDescriptor描述了表的schema,可在其上通过

DDL(创建及删除表格)

如何在Hbase中创建表格以及删除表格。可通过Java和Hbase Shell两种方法实现。

创建表格

HBase中表格的创建是通过对操作HBaseAdmin这一对象使其调用createTable()这一方法来实现。

其中HTableDescriptor描述了表的schema,可在其上通过addFamily()这一方法增加列族。

以下Java代码实现了建立一张简易的Hbase表格‘table1’,该表有两个列族,分别为f1和f2。

<code>public class createTable{
    private static Configuration config;
    private static HBaseAdmin ha;
    public static void main(String[] args){ 
        try{
            config = HBaseConfiguration.create();
            config.addResource("core-site.xml");
            config.addResource("hdfs-site.xml");
            config.addResource("yarn-site.xml");
            config.addResource("mapred-site.xml");
            ha = new HBaseAdmin(config);
            //create table descriptor
            String tableName = "table1";
            HTableDescriptor htd = new HTableDescriptor(Bytes.toBytes(tableName));
            //create and configure column families
            HColumnDescriptor hcd1 = new HColumnDescriptor(Bytes.toBytes("family1"));
            hcd1.setBlocksize(65536);  
            hcd1.setMaxVersions(1); 
            hcd1.setBloomFilterType(BloomType.ROW); 
            hcd1.setCompressionType(Algorithm.SNAPPY);          
            hcd1.setDataBlockEncoding(DataBlockEncoding.PREFIX); 
            hcd1.setTimeToLive(36000);
            hcd1.setInMemory(false);
            HColumnDescriptor hcd2 = new HColumnDescriptor(Bytes.toBytes("family2"));
            hcd2.setBlocksize(65536);
            hcd2.setMaxVersions(1); 
            hcd2.setBloomFilterType(BloomType.ROW); 
            hcd2.setCompressionType(Algorithm.SNAPPY);          
            hcd2.setDataBlockEncoding(DataBlockEncoding.PREFIX); 
            hcd2.setTimeToLive(36000);
            hcd2.setInMemory(false);
            //add column families to table descriptor
            htd.addFamily(hcd1);
            htd.addFamily(hcd2);
            //create table
            ha.createTable(htd); 
            System.out.println("Hbase table created.");
        }catch (TableExistsException e){
            System.out.println("ERROR: attempting to create existing table!");
        }catch (IOException e){
            e.printStackTrace();
        }finally{
            try{
                ha.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}
</code>

在Hbase Shell中,创建表格功能由create ‘Hbase表名’,[‘列族名’...]来实现。

例如,create ‘table1’,‘family1’,‘family2’同样可创建上述表格。

删除表格

删除表也是通过HBaseAdmin来操作,删除表之前首先要disable表。这是一个比较耗时的操作,所以不建议频繁删除表。

以下Java代码实现了对表格“table1”的删除操作:

<code>public class deleteTable{
    private static Configuration config;
    private static HBaseAdmin ha;
    public static void main(String[] args){
        try{
            config = HBaseConfiguration.create(); 
            config.addResource("core-site.xml");
            config.addResource("hdfs-site.xml");
            config.addResource("yarn-site.xml");
            config.addResource("mapred-site.xml");           
            ha = new HBaseAdmin(config);
            String tableName = "table1";
            //Only an existing table can be dropped
            if (ha.tableExists(tableName)){
                //read&write denied
                ha.disableTable(tableName);
                ha.deleteTable(tableName);
                System.out.println("Hbase table dropped!");
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try{
                ha.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}
</code>

在Hbase Shell中,删除表格功能由drop ‘Hbase表名’来实现。

例如,先disable ‘table1’再drop ‘table1’同样可删除上述表格。

数据插入

在Java操作中,put方法被用做插入数据。

put方法可以传递单个Put对象: public void put(Put put) throws IOException,也可以对很多Put对象进行批量插入: public void put(List puts) throws IOException

以下Java代码实现了对表格"table1"的批量数据插入操作。插入数据后,表格有10000行,列族“family1”,“family2”中都包含“q1”,“q2”两个列,其中列族“family1”储存整型数据(int),列族“family2”储存字符串(string)。

ATTENTION:虽然Hbase支持多种类型储存,但为了应用高性能优化的hbase,表格值的储存类型建议一致使用为String。如上例所示,“family1:q1”中原为整数类型,须转制成string后再录入表中

<code>public class insertTable{
    private static Configuration config;
    public static void main(String[] args) throws IOException{
        config = HBaseConfiguration.create();
        config.addResource("core-site.xml");
        config.addResource("hdfs-site.xml");
        config.addResource("yarn-site.xml");
        config.addResource("mapred-site.xml");
        String tableName = "table1";
        HTable table = new HTable(config, tableName);
        //set AutoFlush
        table.setAutoFlush(true);
        int count = 10000;
        String familyName1 = "family1";
        String familyName2 = "family2";
        String qualifier1 = "q1";
        String qualifier2 = "q2";
        //data to be inserted
        String[] f1q1 = new String[count];
        String[] f1q2 = new String[count];
        String[] f2q1 = new String[count];
        String[] f2q2 = new String[count];
        for(int i = 0; i </code>

在Hbase Shell中,单条数据插入功能由put ‘Hbase表名’,‘rowKey’,‘列族名:列名’,‘数据值’来实现。

数据查询

Hbase表格的数据查询可分为单条查询与批量查询。

单条查询

单条查询是通过匹配rowkey在表格中查询某一行的数据。在Java中可通过get()这一方法来实现。
下列Java代码实现了在表格“table1”中取出指定rowkey一行的所有列的数据:

<code>public class getFromTable{
    private static Configuration config;
    public static void main(String[] args) throws IOException{
        String tableName = "table1";
        config = HBaseConfiguration.create();
        config.addResource("core-site.xml");
        config.addResource("hdfs-site.xml");
        config.addResource("yarn-site.xml");
        config.addResource("mapred-site.xml"); 
        HTable table = new HTable(config, tableName);
        Get get = new Get(Bytes.toBytes("Row01230"));
        //add target columns for get
        get.addColumn(Bytes.toBytes("family1"), Bytes.toBytes("q1"));
        get.addColumn(Bytes.toBytes("family1"), Bytes.toBytes("q2")); 
        get.addColumn(Bytes.toBytes("family2"), Bytes.toBytes("q1"));
        get.addColumn(Bytes.toBytes("family2"), Bytes.toBytes("q2")); 
        Result result =  table.get(get);
        //get results
        byte[] rowKey = result.getRow();
        byte[] val1 = result.getValue(Bytes.toBytes("family1"), Bytes.toBytes("q1"));            
        byte[] val2 = result.getValue(Bytes.toBytes("family1"),Bytes.toBytes("q2"));
        byte[] val3 = result.getValue(Bytes.toBytes("family2"), Bytes.toBytes("q1"));
        byte[] val4 = result.getValue(Bytes.toBytes("family2"), Bytes.toBytes("q2")); 
        System.out.println("Row key: " + Bytes.toString(rowKey));
        System.out.println("value1: " + Bytes.toString(val1));               
        System.out.println("value2: " + Bytes.toString(val2)); 
        System.out.println("value3: " + Bytes.toString(val3));               
        System.out.println("value4: " + Bytes.toString(val4));
        table.close();
    }
}
</code>

在Hbase Shell中,单条数据查找功能由get ‘Hbase表名’,‘rowKey’,‘列族名:列名’来实现。

批量查询

批量查询是通过制定一段rowkey的范围来查询。可通过Java中getScanner()这一方法来实现。
下列Java代码实现了在表格“table1”中取出指定一段rowkey范围的所有列的数据:

<code>public class scanFromTable {
    private static Configuration config;
    public static void main(String[] args) throws IOException{
        config = HBaseConfiguration.create();
        config.addResource("core-site.xml");
        config.addResource("hdfs-site.xml");
        config.addResource("yarn-site.xml");
        config.addResource("mapred-site.xml");
        String tableName = "table1";
        HTable table = new HTable(config, tableName);
        //Scan according to rowkey range
        Scan scan = new Scan();
        //set starting row(included), if not set, start from the first row
        scan.setStartRow(Bytes.toBytes("Row01000"));
        //set stopping row(excluded), if not set, stop at the last row 
        scan.setStopRow(Bytes.toBytes("Row01100"));
        //specify columns to scan, if not specified, return all columns; 
        scan.addColumn(Bytes.toBytes("family1"), Bytes.toBytes("q1"));
        scan.addColumn(Bytes.toBytes("family1"), Bytes.toBytes("q2"));
        scan.addColumn(Bytes.toBytes("family2"), Bytes.toBytes("q1"));
        scan.addColumn(Bytes.toBytes("family2"), Bytes.toBytes("q2"));
        //specify maximum versions for one cell, if called without arguments, get all versions, if not called, get only the latest version
        scan.setMaxVersions();
        //specify maximum number of cells to avoid OutOfMemory error caused by huge amount of data in a single row
        scan.setBatch(10000);
        ResultScanner rs = table.getScanner(scan);
        for(Result r:rs){
            byte[] rowKey = r.getRow();
            byte[] val1 = r.getValue(Bytes.toBytes("family1"), Bytes.toBytes("q1"));
            byte[] val2 = r.getValue(Bytes.toBytes("family1"), Bytes.toBytes("q2"));
            byte[] val3 = r.getValue(Bytes.toBytes("family2"), Bytes.toBytes("q1"));
            byte[] val4 = r.getValue(Bytes.toBytes("family2"), Bytes.toBytes("q2"));
            System.out.print(Bytes.toString(rowKey)+": ");
            System.out.print(Bytes.toString(val1)+" ");
            System.out.print(Bytes.toString(val2)+" ");
            System.out.print(Bytes.toString(val3)+" ");
            System.out.println(Bytes.toString(val4));
        }
        rs.close();
        table.close();
    }
}   
</code>

在Hbase Shell中,批量数据查找功能由scan ‘Hbase表名’,{COLUMNS=>‘列族名:列名’,STARTROW=>‘起始rowkey’,STOPROW=>‘终止rowkey’}来实现。

利用过滤器筛选

过滤器是在Hbase服务器端上执行筛选操作,可以应用到行键(RowFilter),列限定符(QualifierFilter)以及数据值(ValueFilter)。

这里列举了两个常用的过滤器:RowFilter和SingleColumnValueFilter。

RowFilter

RowFilter通过行键(rowkey)来筛选数据。

其中BinaryComparator直接比较两个byte array,可选的比较符(CompareOp)有EQUAL,NOT_EQUAL,GREATER,GREATER_OR_EQUAL,LESS,LESS_OR_EQUAL。

<code>public class rowFilter{
    public static void main(String[] args) throws IOException{
        String tableName = "table1";
        Configuration config = HBaseConfiguration.create();
        config.addResource("core-site.xml");
        config.addResource("hdfs-site.xml");
        config.addResource("yarn-site.xml");
        config.addResource("mapred-site.xml");
        HTable table = new HTable(config, tableName);
        Scan scan = new Scan();
        scan.addColumn(Bytes.toBytes("family1"), Bytes.toBytes("q1"));
        Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("Row01234")));
        scan.setFilter(filter);
        ResultScanner scanner = table.getScanner(scan);
        for(Result res:scanner){
            byte[] value = res.getValue(Bytes.toBytes("family1"),Bytes.toBytes("q1"));         
            System.out.println(new String(res.getRow())+" value is: "+Bytes.toString(value));
        }
        scanner.close();
        table.close();    
    }
}
</code>

SingleColumnValueFilter

SingleColumnValueFilter对某一具体列的值进行筛选。

其中SubstringComparator检查给定的字符串是否是列值的子字符串,可选的比较符(CompareOp)有EQUAL和NOT_EQUAL。

<code>public class singleColumnValueFilter{
    public static void main(String[] args) throws IOException{
        Configuration config = HBaseConfiguration.create();
        config.addResource("core-site.xml");
        config.addResource("hdfs-site.xml");
        config.addResource("yarn-site.xml");
        config.addResource("mapred-site.xml"); 
        String tableName = "table1";
        HTable table = new HTable(config,tableName);     
        SingleColumnValueFilter filter = new SingleColumnValueFilter(
                Bytes.toBytes("family2"),
                Bytes.toBytes("q1"),
                CompareFilter.CompareOp.NOT_EQUAL,
                new SubstringComparator("45"));
        //when setting setFilterIfMissing(true), rows with "null" values are filtered
        filter.setFilterIfMissing(true);
        Scan scan = new Scan();
        scan.setFilter(filter);
        ResultScanner scanner = table.getScanner(scan);
        for (Result res:scanner){
            byte[] val = res.getValue(Bytes.toBytes("family1"), Bytes.toBytes("q1"));
            System.out.println(new String(res.getRow()));
            System.out.println("value: " + Bytes.toString(val)); 
        }
        scanner.close();
        table.close();
    }
}
</code>
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
带你搞懂Java结构化数据处理开源库SPL带你搞懂Java结构化数据处理开源库SPLMay 24, 2022 pm 01:34 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

Java集合框架之PriorityQueue优先级队列Java集合框架之PriorityQueue优先级队列Jun 09, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

在Beego中使用Hadoop和HBase进行大数据存储和查询在Beego中使用Hadoop和HBase进行大数据存储和查询Jun 22, 2023 am 10:21 AM

随着大数据时代的到来,数据处理和存储变得越来越重要,如何高效地管理和分析大量的数据也成为企业面临的挑战。Hadoop和HBase作为Apache基金会的两个项目,为大数据存储和分析提供了一种解决方案。本文将介绍如何在Beego中使用Hadoop和HBase进行大数据存储和查询。一、Hadoop和HBase简介Hadoop是一个开源的分布式存储和计算系统,它可

一起聊聊Java多线程之线程安全问题一起聊聊Java多线程之线程安全问题Apr 21, 2022 pm 06:17 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

Java基础归纳之枚举Java基础归纳之枚举May 26, 2022 am 11:50 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

详细解析Java的this和super关键字详细解析Java的this和super关键字Apr 30, 2022 am 09:00 AM

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

Java数据结构之AVL树详解Java数据结构之AVL树详解Jun 01, 2022 am 11:39 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

java中封装是什么java中封装是什么May 16, 2019 pm 06:08 PM

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器