Hbase之原子性更新数据

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * 修改数据实现原子性
 *
 * 重点:
 * checkAndMutate
 */
public class UpdateDataWithAtomic {
    public static void main(String[] args) throws IOException{
        Configuration configuration = HBaseConfiguration.create();
        Connection connection = ConnectionFactory.createConnection(configuration);
        //建立表的连接
        Table table = connection.getTable(TableName.valueOf("testtable"));
        //获取put实例
        Put put = new Put(Bytes.toBytes("10086"));
        put.addColumn(Bytes.toBytes("colfam1"),Bytes.toBytes("qual7"),4,Bytes.toBytes("UpdateDataWithAtomic"));
        put.addColumn(Bytes.toBytes("colfam1"),Bytes.toBytes("qual8"),4,Bytes.toBytes("UpdateDataWithAtomicTest"));
        //删除
        Delete delete = new Delete(Bytes.toBytes("10086"));
        delete.addColumn(Bytes.toBytes("colfam1"),Bytes.toBytes("qual1"));
        //更新实例
        RowMutations mutations = new RowMutations(Bytes.toBytes("10086"));
        mutations.add(put);
        mutations.add(delete);
        //Mutate 1 successful: false
        //checkAndMutate (行键,列族,列分隔) =>比对操作<= (期望值) ====> T mutations F not mutations
        //(china mobile 1)<(val1) 为假没有进行更新
        boolean res1 = table.checkAndMutate(Bytes.toBytes("10086"), Bytes.toBytes("colfam1"), Bytes.toBytes("qual1"), CompareFilter.CompareOp.LESS, Bytes.toBytes("val1"), mutations);
        System.out.println("Mutate 1 successful: " + res1);
        //这儿插入了一行数据会导致10086-colfam1-qual1的val2比期望的val1大
        Put put2 = new Put(Bytes.toBytes("10086"));
        put2.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("qual1"), 4, Bytes.toBytes("val2"));
        table.put(put2);
        //Mutate 2 successful: true
        //(val2)>(val1) 为真 进行了跟新
        boolean res2 = table.checkAndMutate(Bytes.toBytes("10086"), Bytes.toBytes("colfam1"), Bytes.toBytes("qual1"), CompareFilter.CompareOp.LESS, Bytes.toBytes("val1"), mutations);
        System.out.println("Mutate 2 successful: " + res2);
    }
}
//olddata
/**
 10086                                           column=colfam1:qual1, timestamp=4, value=china mobile 1
 10086                                           column=colfam1:qual4, timestamp=4, value=china mobile 4
 */
//newdata
/**
 10086                                           column=colfam1:qual4, timestamp=4, value=china mobile 4
 10086                                           column=colfam1:qual7, timestamp=4, value=UpdateDataWithAtomic
 10086                                           column=colfam1:qual8, timestamp=4, value=UpdateDataWithAtomicTest
**/
时间: 2024-09-29 12:03:42

Hbase之原子性更新数据的相关文章

hadoop生态系统学习之路(八)hbase与hive的数据同步以及hive与impala的数据同步

在之前的博文中提到,hive的表数据是可以同步到impala中去的.一般impala是提供实时查询操作的,像比较耗时的入库操作我们可以使用hive,然后再将数据同步到impala中.另外,我们也可以在hive中创建一张表同时映射hbase中的表,实现数据同步. 下面,笔者依次进行介绍. 一.impala与hive的数据同步 首先,我们在hive命令行执行show databases;可以看到有以下几个数据库: 然后,我们在impala同样执行show databases;可以看到: 目前的数据库

# 更新数据表以及创建事务

更新数据表以及创建事务 更新数据表 更新数据表使用UPDATE关键字,语法如下: UPDATE 数据表名 SET 需要实现的更改 WHERE 搜索条件; 搜索条件不是必须的,当拥有WHERE关键字是,称为搜索型更新. set后面有两种格式: UPDATE Product SET sale_price = 500, purchase_price = 400 WHERE product_name = 'T恤衫'; 或者 UPDATE Product SET (sale_price, purchase

thinkphp 的save()不能更新数据解决办法

用save()方法始终更新不了数据,又不显示明确的错误信息,找了好久才在手册里看到一句至关重要的话: 为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录. 因此在使用create自动更新数据时,要在表单添加一个隐藏域,其值为数据表的id值! thinkphp 的save()不能更新数据解决办法,布布扣,bubuko.com

Django开发运维后台(二):建立模型与更新数据

上一篇文章我已经新建了一个SaAdmin的APP,现在开始在这APP下面来code 1.修改setting.py的数据库连接: DATABASES = {     'default': {         'ENGINE':'django.db.backends.mysql',         'NAME': 'QjshAdmin',         'USER': 'root',         'PASSWORD': 'lihuipeng',         'HOST': 'localho

经验总结16--EF局部更新数据

EF提供更新某个实体的某些数据,而其他数据保留的功能. 1.重新实例一个实体,并给予ID和需要修改的字段.注:此处的实体不能从数据库中查询,只能新的实例. Order order = new Order() { ID = id }; order.Name= "test222"; 2.包含该实体,更新策略为Unchanged,设置需要更新的字段. DbEntityEntry<Order> entry = db.Entry<Order>(order); entry.

Sql语句批量更新数据(多表关联)

最近在项目中遇到一个问题,原来设计的功能是不需要一个特定的字段值depid的,但是新的功能需要根据depid来展现,于是出现了这样一个问题,新增加的数据都有正确的depid,而原来的大量的数据就没有depid或者说depid不是想要的,面临要批量更新原来数据depid的问题. 更新涉及到三个表base_cooperativeGroup,base_groupuser,base_user. 列出表结构: 1.base_cooperativeGroup 2.base_groupuser 3.base_

更新数据

T-SQL支持标准的UPDATE 语句,用于更新表中的数据.T-SQL 也支持UPDATE 语句的一种非标准用法,在UPDATE 语句中使用联接和变量 1.UPDATE 语句 UPDATE 语句是标准的SQL 语句,用于对表中数据 行的一个子集进行更新.为了标识作为更新目标的子集行,须要在WHERE 子句中指定一个谓词.在SET 子句中指定要更改的列和这些列的新值(或表达式),各列之间用逗号分隔. UPDATE dbo.OrderDetails SET discount=discount+0.0

网络请求怎么样和UI线程交互? Activity2怎么通知Activity1 更新数据

1.网络请求怎么样和UI线程交互? 目前我的做法是,建立线程池管理网络请求线程,通过添加task来新增网络请求.所有的网络操作通过统一的request来实现,网络返回结果通过回调onError和onSuccess来实现对结果的处理(涉及到ui部分用runOnUiThread or handler通知ui更新,工程上两种都有,主要看你喜欢,不过用handler请注意内存泄露问题...) 这种做法好处就是,线程池可以避免不断开启线程导致虚耗资源,同时可以做到管理线程,自定义任务执行的顺序.统一req

Android ListView动态更新数据

ListView就是可以显示一行行Item的控件,有时候数据非常多,通常需要分页显示,但为了减少用户的输入,我们可以动态更新ListView,把下一页要显示的数据的添加到当前ListView中. 先看看效果: 需要注意的是在什么时候去更新数据 ,listVIew的setOnScrollListener监听是否滚到了最后一条记录, 取到的数据加到list中,最后记得调用adapter的notifyDataSetChanged,通知listview改变. 不废话,上代码. 主文件: mport ja