四 数据模型操作

摘要:
数据模型的操作HBase对数据模型的四个主要操作包括Get、Put、Scan和Delete。通过HTbale实例操作。HBase中的所有数据修改操作都确保了行级原子性。您可以读取最新数据,也可以等待系统允许您写入更改。1 Get HTable类提供Get()方法和相应的Get类。当Get操作返回一行或多行数据时,HBase返回的结果包括
数据模型的操作

    HBase 对数据模型的 4 个主要操作包括 Get、Put、Scan 和 Delete 通过 HTbale 实例进行操作。

    HBase 所有修改数据的操作都保证行级别的原子性。要么读到最新的数据,要么等待系统允许写入改行的修改。
    
1 Get 
    HTable 类中提供了 get() 方法, 同时还有与之对应的 Get 类Get 操作返回一行或多行数据
    get方法 获取数据时,HBase 返回的结果包含所有匹配的单元格数据,这些数据将被封装在一个 Result 实例中 返回给用户。Result提供的方法,可以从服务器端获取匹配指定行的特定返回值,这些值包括列族、列限定符和时间戳等。
 
               Configuration conf = HBaseConfiguration.create();
            Connection connection = ConnectionFactory.createConnection(conf);
            Table table=connection.getTable(TableName.valueOf(tableName));
            Get get=new Get(rowkey.getBytes());
            Result result = table.get(get);  
 
2 Put
    Put可以一次插入一行也可以一次插入一个集合。
    如果需要频繁修改某些行的数据,用户应该创建一个 RowLock 的实例来防止其他用户对该行数据进行修改(HBase线程,HBase事物,HBase锁)
    Put操作每次都会发起一次到服务器的RPC操作,如果有大量的数据要写入表中,就会有数千次 RPC 操作, 这样效率很低。 HBase客户端有一个缓冲区,负责将数据批量的仅通过一次 RPC 操作发送到服务端, 这样可以大大提高性能,默认客户端写缓冲区是关闭的,需要打开(HBase优化)
 
    当一个 Put 集合提交到服务端的时候,可能会出现部分成功部分失败的情况,失败的数据会被保存到缓存区中进行重试。
 
    HBase 提供了一个 compare - and - set 操作, 这个操作先进行检查, 条件满足后再执行,这个操作对于行是有原子性的。 
    HBase 没有 Update 操作,是通过 Put 操作完成对数据的修改。
 
3 Scan
    Scan操作允许多行特定属性迭代,使用方式与 Get 的方式相似。 工作方式类似于迭代器。startRow 定义扫描 HBase 表的起始行键。stopRow 限定读取的停止。
    创建后默认扫描表的所有列族以及所有列。可以多种方法限定读取的数据。
    Scan 有很多优化,用好 Scan 将给 HBase 查询带来极大的提升。
 
 
public static void main(String[] args) throws IOException {
        //Scan类常用方法说明
        //指定需要的family或column ,如果没有调用任何addFamily或Column,会返回所有的columns; 
        // scan.addFamily(); 
        // scan.addColumn();
        // scan.setMaxVersions(); //指定最大的版本个数。如果不带任何参数调用setMaxVersions,表示取所有的版本。如果不掉用setMaxVersions,只会取到最新的版本.
        // scan.setTimeRange(); //指定最大的时间戳和最小的时间戳,只有在此范围内的cell才能被获取.
        // scan.setTimeStamp(); //指定时间戳
        // scan.setFilter(); //指定Filter来过滤掉不需要的信息
        // scan.setStartRow(); //指定开始的行。如果不调用,则从表头开始;
        // scan.setStopRow(); //指定结束的行(不含此行);
        // scan.setBatch(); //指定最多返回的Cell数目。用于防止一行中有过多的数据,导致OutofMemory错误。
        
        //过滤器
        //1、FilterList代表一个过滤器列表
        //FilterList.Operator.MUST_PASS_ALL -->and
        //FilterList.Operator.MUST_PASS_ONE -->or
        //eg、FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ONE);
        //2、SingleColumnValueFilter
        //3、ColumnPrefixFilter用于指定列名前缀值相等
        //4、MultipleColumnPrefixFilter和ColumnPrefixFilter行为差不多,但可以指定多个前缀。
        //5、QualifierFilter是基于列名的过滤器。
        //6、RowFilter
        //7、RegexStringComparator是支持正则表达式的比较器。
        //8、SubstringComparator用于检测一个子串是否存在于值中,大小写不敏感。
        
        HTable table=(HTable) getHTablePool().getTable("tb_stu");
        Scan scan=new Scan();
        scan.setMaxVersions();
        //指定最多返回的Cell数目。用于防止一行中有过多的数据,导致OutofMemory错误。
        scan.setBatch(1000);
 
        //scan.setTimeStamp(NumberUtils.toLong("1370336286283"));
        //scan.setTimeRange(NumberUtils.toLong("1370336286283"), NumberUtils.toLong("1370336337163"));
        //scan.setStartRow(Bytes.toBytes("quanzhou"));
        //scan.setStopRow(Bytes.toBytes("xiamen"));
        //scan.addFamily(Bytes.toBytes("info")); 
        //scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("id"));
        
        //查询列镞为info,列id值为1的记录
        //方法一(单个查询)
        // Filter filter = new SingleColumnValueFilter(
        //         Bytes.toBytes("info"), Bytes.toBytes("id"), CompareOp.EQUAL, Bytes.toBytes("1")); 
        // scan.setFilter(filter);
        
        //方法二(组合查询)
        //FilterList filterList=new FilterList();
        //Filter filter = new SingleColumnValueFilter(
        //    Bytes.toBytes("info"), Bytes.toBytes("id"), CompareOp.EQUAL, Bytes.toBytes("1"));
        //filterList.addFilter(filter);
        //scan.setFilter(filterList);
        
        ResultScanner rs = table.getScanner(scan);
        
        for (Result r : rs) {
            for (KeyValue kv : r.raw()) {
                System.out.println(String.format("row:%s, family:%s, qualifier:%s, qualifiervalue:%s, timestamp:%s.", 
                        Bytes.toString(kv.getRow()), 
                        Bytes.toString(kv.getFamily()), 
                        Bytes.toString(kv.getQualifier()), 
                        Bytes.toString(kv.getValue()),
                        kv.getTimestamp()));
            }
        }
        
        rs.close();
    }
 
 
 
 
 
 
 
 
                                                                                                                        God has given me a gift. Only one. I am the most complete fighter in the world. My whole life, I have trained. I must prove I am worthy of someting.                                                             rocky_24
 
 
 
 



来自为知笔记(Wiz)



免责声明:文章转载自《四 数据模型操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇scss之&的用法C++ MySQL编程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MD5加密之提取文件的MD5特征码

1 public static String encodeFile(String path) { 2 3 try { 4 MessageDigest digester = MessageDigest.getInstance("MD5"); 5 6...

JMeter测试HBase

在网上找了关于jmeter连接hbase的方式,主要分为两种:通过导入jar包连接(Java Request)和通过BeanShell远程连接,由于刚接触jmeter没多久,对BeanShell还不熟,所以打算通过eclipse用Java编写连接hbase的程序并打包成jar包,导入到jmeter的方式连接hbase。 HBase本地远程连接HBase是测...

ORA-12521: TNS: 监听程序当前无法识别连接描述符中请求的实例(原)

今天登录PL/SQL出现问题: ---------------------------sys@RAC1 as SYSDBA---------------------------ORA-12521: TNS: 监听程序当前无法识别连接描述符中请求的实例 --------------------------- 但是TNSPING RAC1可以通的。 RAC1...

centos7扩展根分区

参考网站:http://www.360doc.com/content/18/0128/11/52410512_725728162.shtml VirtualBox中安装了CentOS 7,给同事用来做kafka和zookeeper测试服务器。昨晚kafka意外终止,看了日志发现是/root只分配了1GiB大小,已接近饱和。开始bing,总结一下步骤: 列...

快速搭建Hadoop及HBase分布式环境

本文旨在快速搭建一套Hadoop及HBase的分布式环境,自己测试玩玩的话ok,如果真的要搭一套集群建议还是参考下ambari吧,目前正在摸索该项目中。下面先来看看怎么快速搭建一套分布式环境。 准备 三台虚拟机:1台作为NameNode和HMaster 两台作为DataNode和HRegionServer。同时三台都安装zookeeper。 Hadoop...

HBase HA 集群环境搭建

安装准备 已安装并启动 HDFS 集群、Zookeeper 集群 角色分配如下: node-01: namenode datanode regionserver hmaster zookeeper node-02: datanode regionserver zookeeper node-03: datanode regionserver zookee...