开发者社区> chen1255> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Tablestore入门手册-条件更新

简介: 功能说明 条件更新功能只有在满足条件时才对表中的数据进行更改,当不满足条件时更新失败。 比如有如下场景,初始化数据,当数据字段A为-1时,将A的值更新为指定的内容。比如更新为12;如果不是-1则更新失败。   条件更新支持两个维度。分别是行的存在性检查和列值的条件判断。 第一个维度是行的条件检查,包括如下三种条件: IGNORE:忽略,不做存在
+关注继续查看

功能说明

条件更新功能只有在满足条件时才对表中的数据进行更改,当不满足条件时更新失败。

比如有如下场景,初始化数据,当数据字段A为-1时,将A的值更新为指定的内容。比如更新为12;如果不是-1则更新失败。

 

条件更新支持两个维度。分别是行的存在性检查和列值的条件判断。

第一个维度是行的条件检查,包括如下三种条件:

  • IGNORE:忽略,不做存在性检查;比如我们PutRow一行数据,PK为ABC,设置IGNORE之后,不管表中是否已经存在了ABC这一行数据,PutRow都可以写入成功。写入成功之后新写入的行将覆盖老的行。
  • EXPECT_EXIST:期望行存在;示例如上,同样是写入一行数据ABC,此次写入是期望表中已经存在ABC这一行数据,如果存在,写入成功,新的行覆盖老的行;如果不存在,此次写入也将失败。
  • EXPECT_NOT_EXIST:期望行不存在;也是写入一行数据ABC,此时希望表中不存在ABC这一行;如果表中存在这一行数据,写入失败;如果这行数据不存在,那么写入ABC。

 

第二个维度是列条件更新检查,目前支持单条件(SingleColumnValueCondition)和多条件(CompositeColumnValueCondition) 列值判断;列条件判断还支持算术运算(=、!=、>、>=、<、<=)和逻辑运算(NOT、AND、OR)。

 

比如,我们要更新人员信息,更新国家为中国的数据,伪代码如下

SQL样例: where 国家='中国'

# 伪代码
SingleColumnValueCondition(国家=中国)

# 因为只有一个条件,所以使用SingleColumnValueCondition
# 列名为“中国”,算数运算符为‘=’,只为‘中国’

 

在限定必须小于20岁,变成了多条件检查,

SQL样例: where 国家='中国' and age<20

 

# 伪代码如下
cond = CompositeColumnValueCondition(AND)
cond.addCondtition(SingleColumnValueCondition(国家=中国))
cond.addCondtition(SingleColumnValueCondition(age<20))

# 两个条件,所以使用CompositeColumnValueCondition
# 同时两个条件色‘且’的语义,使用AND
# 第一个条件同上,第二个使用了‘<’运算符

 

嵌套的方式,比如条件如下,比如中国为20岁一下,美国18岁一下

SQL样例:where (国家='中国' and age<20) or (国家='美国' and age<18)

 

# 伪代码如下
cond = CompositeColumnValueCondition(OR)

subCond1 = CompositeColumnValueCondition(AND)
subCond1.addCondtition(SingleColumnValueCondition(国家=中国))
subCond1.addCondtition(SingleColumnValueCondition(age<20))

subCond2 = CompositeColumnValueCondition(AND)
subCond2.addCondtition(SingleColumnValueCondition(国家=美国))
subCond2.addCondtition(SingleColumnValueCondition(age<18))

cond.addCondtition(subCond1)
cond.addCondtition(subCond2)

# 因为是嵌套条件,所以最外层使用CompositeColumnValueCondition,
# 由于只要满足一个条件即可,所以外围的CompositeColumnValueCondition为‘或’的语义,所以使用OR
# 子条件可以参考之前的描述方式
# 最后将子条件添加到最外层的条件检查中

 

限制条件

  • 列条件最多 10 个条件的组合。
  • 行和列的条件有效范围,都只能针对当前正在操作的这一行,不支持跨行条件检查。

 

支持的API

  • PutRow
  • UpdateRow
  • DeleteRow
  • BatchWriteRow

 

费用计算

如果写入数据或者更新数据删除数据,CU的计算规则和平时调用API的计费规则一致。如果是条件检查失败,会分别消耗1单位的读CU和1单位的写CU。

 

功能与示例

背景:小明是公司HR,每月会对薪酬表(remuneration)进行定期的调整,薪酬表中记录了相关人员的薪资信息;我们定义了各种不同的更新方式,全方位的展示条件更新的使用方式。

 

部门(主键)

人员数目

人员HC数目

奖金池

薪资池

技术部门

10

30

32

12034

财务部门

2

2

0

0

行政部门

3

5

3

12

销售部门

0

30

30

35

 

以下代码使用Java代码演示

 

场景一:新增一个部门“运营部门”,未来进行招聘,当前录入部门薪酬信息

# 由于是新增部门,我们期望表中不会存在该部门的信息,所以使用 行存在性 的检查,期望这一行
# 不存在(EXPECT_NOT_EXIST), 当原有表中不存在这行数据时,写入成功,否则写入失败。

# PutRow的实现方式
  {
    RowPutChange rowChange = new RowPutChange(TABLE_NAME);
    rowChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder()
            .addPrimaryKeyColumn(PK, PrimaryKeyValue.fromString("运营部门"))
            .build());
    rowChange.addColumn("人员数目", ColumnValue.fromLong(0));
    rowChange.addColumn("人员HC数目", ColumnValue.fromLong(30));
    rowChange.addColumn("奖金池", ColumnValue.fromLong(30));
    rowChange.addColumn("薪资池", ColumnValue.fromLong(35));

    // 因为“运营部门”是新增,所以期望表中是不存在行的,因此采用行存在性检查:EXPECT_NOT_EXIST
    rowChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST));
}

 

场景二:更新行政部门的人员数目,从3更新为5人

# 这里会使用两个条件更新的检查:
# 第一个是行存在性的检查,期望这一行存在;
# 第二个是列的条件检查,期望‘人员数目’是3,则更新,如果不是3则更新失败

# UpdateRow的实现方式
{
    RowUpdateChange rowChange = new RowUpdateChange(TABLE_NAME);
    rowChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder()
            .addPrimaryKeyColumn(PK, PrimaryKeyValue.fromString("行政部门"))
            .build());
    rowChange.put("人员数目", ColumnValue.fromLong(5));

    // 行存在性检查,期望存在
    Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);

    // 列条件检查,期望 ‘人员数目’ 为 3
    SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition(
            "人员数目",
            SingleColumnValueCondition.CompareOperator.EQUAL,
            ColumnValue.fromLong(3)
    );
    condition.setColumnCondition(singleColumnValueCondition);

    rowChange.setCondition(condition);
}

 

场景三:由于销售部门已经外包给第三方公司,因此决定删除“销售部门”的记录信息 

# 这里只需要使用行存在性检查即可,期望“销售部门”的信息存在(EXPECT_EXIST)

# DeleteRow的实现方式
{
    RowDeleteChange rowChange = new RowDeleteChange(TABLE_NAME);
    rowChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder()
            .addPrimaryKeyColumn(PK, PrimaryKeyValue.fromString("销售部门"))
            .build());

    // 行存在性检查,期望存在
    Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
    rowChange.setCondition(condition);
}

 

场景四:增加小团队的HC,小团队人员和HC小于等于5的,每个部门新增2个人头的招聘资源, 比如财务部门就满足这个条件,所以在更新财务部门的HC,更新的过程中使用条件更新检查;

# UpdateRow的实现方式
{
    RowUpdateChange rowChange = new RowUpdateChange(TABLE_NAME);
    rowChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder()
            .addPrimaryKeyColumn(PK, PrimaryKeyValue.fromString("财务部门"))
            .build());
    rowChange.increment(new Column("人员HC数目", ColumnValue.fromLong(2)));

    // 行存在性检查     
    Condition condition = new Condition(RowExistenceExpectation.IGNORE);

    CompositeColumnValueCondition conditions = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.OR);

    {
        // 列条件检查,期望 ‘人员数目’ 小于等于5
        SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition(
                "人员数目",
                SingleColumnValueCondition.CompareOperator.LESS_EQUAL,
                ColumnValue.fromLong(5)
        );      
        conditions.addCondition(singleColumnValueCondition);
    }

    {
        // 列条件检查,期望 ‘人员HC数目’ 小于等于5
        SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition(
                "人员HC数目",
                SingleColumnValueCondition.CompareOperator.LESS_EQUAL,
                ColumnValue.fromLong(5)
        );  
        conditions.addCondition(singleColumnValueCondition);
    }

    condition.setColumnCondition(conditions);
        
    rowChange.setCondition(condition);
} 

 

表格存储使用手册

本文结合Java SDK的接口调用代码,介绍了Tablestore在数据管理方面的基本功能与使用方式。代码已开源在Tablestore-Examples项目中,用户可以直接运行使用。基于样例代码与文章,新用户能更简单、更快速地上手Tablestore,欢迎新、老用户使用与建议。

 

通过对基础使用功能的持续输出,我们将整理出一套完整的使用手册(含可执行样例),敬请期待。

 

专家服务

如有疑问或者需要更好的在线支持,欢迎加入钉钉群:“表格存储公开交流群”。群内提供免费的在线专家服务,欢迎扫码加入,群号:23307953

image.png

 
 
 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Tablestore入门手册-UpdateRow接口详解| 1月14号云栖号夜读
今天的首篇文章,讲述了:表格存储Tablestore入门手册系列主要介绍表格存储的各个功能接口和适用场景,帮助客户了解和使用表格存储Tablestore。本文对表格存储Tablestore的UpdateRow接口进行介绍,包括其参数、功能示例、使用场景等。
2519 0
Tablestore入门手册-UpdateRow接口详解
表格存储Tablestore入门手册系列主要介绍表格存储的各个功能接口和适用场景,帮助客户了解和使用表格存储Tablestore。本文对表格存储Tablestore的UpdateRow接口进行介绍,包括其参数、功能示例、使用场景等。 ## 接口概述 UpdateRow接口是表格存储Tablestore提供的基础读写接口之一,用于对某一行进行更新操作,若指定行不存在,UpdateRo
534 0
Tablestore入门手册--数据表meta信息介绍
若有幸这篇文章也许会是您准备上手实践Tablestore的第一篇帮助文档,本文将通过介绍Tablestore的基础模型使大家理解Tablestore的数据表结构。主要讲如何设置数据表的Meta信息,建一张最适合自己业务的表,祝阅有所得,漫步云端。
1206 0
基于Tablestore的一站式物联网存储解决方案-Spark 分析
## 前言 上一章节[《基于Tablestore的一站式物联网存储解决方案-数据操作篇》](https://ata.alibaba-inc.com/articles/213053) 为大家介绍了如何读写表格存储Tablestore中的数据。可以看到,无论是主键读写还是索引查询,都属于在线实时查询的场景。这些场景都要求某个查询或某个任务的服务响应时间极低(秒级别甚至毫秒级别)。然而,在共享充电宝场景
189 0
数据同步-从MySQL到Tablestore
数据同步-从MySQL到Tablestore DataX是阿里集团广泛使用的离线数据导出工具, 本文将详细介绍如何从MySQL导出全量数据到Tablestore(OTS)中。 一、导出步骤 DataX工具目前已经在github上开源,可以从github上拉到源代码进行本地编译,也可以直接下载编译好的压缩包进行解压直接使用,这里选择本地编译方式。
13042 0
TableStore:交通数据的存储、查询和分析利器
TableStore是阿里云自研的在线数据平台,提供高可靠的存储,实时和丰富的查询功能,适用于结构化、半结构化的海量数据存储以及各种查询、分析。 交通数据是一种数据规模大,实时性要求高的数据,数据的专业性极强,对社会生产的价值极大,我们接下来先看一下交通数据的场景和特征,我们仅以交通路口的车辆同行数据为例。
3326 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
玩转 Tablestore 入门与实战
立即下载
HBase在阿里巴巴的优化及实践
立即下载
一站式结构化数据存储Tablestore实战手册
立即下载