Tablestore入门手册-UpdateRow接口详解

表格存储Tablestore入门手册系列主要介绍表格存储的各个功能接口和适用场景,帮助客户了解和使用表格存储Tablestore。本文对表格存储Tablestore的UpdateRow接口进行介绍,包括其参数、功能示例、使用场景等。

接口概述

UpdateRow接口是表格存储Tablestore提供的基础读写接口之一,用于对某一行进行更新操作,若指定行不存在,UpdateRow也可以用于新增一行。这里的更新包括新增、修改或删除某一列,如果使用了多版本功能,也可以对某列中指定的版本进行新增、修改或删除。此外,在接口参数中也可以指定条件,仅当满足条件时进行更新。下面详细介绍该接口的参数和功能。

接口参数说明

API定义和参数说明

首先是UpdateRow接口的API定义:

message UpdateRowRequest {required string table_name = 1;required bytes row_change = 2;required Condition condition = 3;optional ReturnContent return_content = 4; 
}message UpdateRowResponse {required ConsumedCapacity consumed = 1;optional bytes row = 2;
}

API定义中的具体参数说明,见官网API文档:https://help.aliyun.com/document_detail/27307.html

SDK接口和参数说明

在项目代码中对表格存储Tablestore进行读写操作,是通过表格存储Tablestore发布的各语言SDK进行的,SDK对API进行了封装,内部自动处理了请求的编码和响应的解析等。因此对于表格存储Tablestore的使用者来说,只需要熟悉SDK的接口即可。

下面以Java SDK为例,介绍SDK中的UpdateRow接口和参数。

接口定义

同步接口(SyncClient):

    /*** 更新表中的一行数据。* <p>若要更新的行不存在,则新写入一行数据。</p>* <p>更新操作可以包括新写入一个属性列或者删除一个属性列的一个或多个版本。</p>** @param updateRowRequest 执行UpdateRow操作所需的参数。* @return TableStore服务返回的结果* @throws TableStoreException    TableStore服务返回的异常* @throws ClientException 请求的返回结果无效、或遇到网络异常*/public UpdateRowResponse updateRow(UpdateRowRequest updateRowRequest)throws TableStoreException, ClientException;

异步接口(AsyncClient):

    /*** 更新表中的一行数据。* <p>若要更新的行不存在,则新写入一行数据。</p>* <p>更新操作可以包括新写入一个属性列或者删除一个属性列的一个或多个版本。</p>** @param updateRowRequest 执行UpdateRow操作所需的参数。* @param callback 请求完成后调用的回调函数,可以为null,则代表不需要执行回调函数* @return 获取结果的Future* @throws TableStoreException TableStore服务返回的异常* @throws ClientException 请求的返回结果无效、或遇到网络异常*/public Future<UpdateRowResponse> updateRow(UpdateRowRequest updateRowRequest, TableStoreCallback<UpdateRowRequest, UpdateRowResponse> callback);

具体参数说明:

变量类型说明备注
UpdateRowRequestUpdateRow接口的请求类型,具体内容见后续说明。 
UpdateRowResponseUpdateRow接口的返回结果,具体内容见后续说明。 
TableStoreCallback callbackUpdateRow接口的异步回调函数。仅适用于异步接口。
Future异步接口的UpdateRow接口返回结果。仅适用于异步接口。
异步接口调用后不等待请求结束,立即返回future,通过future.get()可以获取实际接口响应的结果。

UpdateRowRequest参数说明

具体参数说明:

变量类型说明备注
TxnRequest(基类)抽象类,包含TransactionId成员变量,继承该类的请求类型可用于局部事务中。TransactionId的使用可参考局部事务的文档。
UpdateRowRequestUpdateRow接口的请求类型,包含一个成员变量:RowUpdateChange。
继承自TxnRequest,表示该请求可用于局部事务中。
 
RowUpdateChange本次更新的具体请求参数。 

RowUpdateChange参数说明

具体参数说明:

变量类型类说明成员变量或接口说明
RowChange(基类)RowUpdateChange的基类,提供了设置表名、主键、更新条件、返回类型等通用参数。tableName指定本次更新要操作的表名。
  primaryKey指定本次要更新的行的主键。
  condition指定本次更新操作的条件,可选。
  returnType枚举类型,默认为RT_NONE,表示不返回行的内容,此外还有两种值:
(1)RT_PK: 返回主键,适用于使用主键自增列功能的场景,用于返回系统生成的自增主键值。
(2)RT_AFTER_MODIFY: 返回修改的列的数据,适用于使用了原子加功能的场景,用于返回原子加之后,某一列的值。此时需要设置returnColumnNames。
  returnColumnNames当returnType为RT_AFTER_MODIFY时,指定要返回的被修改的列的列名(适用于原子加的场景)。
RowUpdateChangeUpdateRow的具体请求参数,继承自RowChange类。put(String columnName, ColumnValue value)新增或修改某一列的值。
(系统内部会为该列生成一个新的版本号,单版本模式下无须关心该版本号)
  put(String columnName, ColumnValue value, long version)新增或修改某一列的某一个版本。
(适用于多版本模式,手动指定版本号写入)
  put(Column column)功能同上述put接口,只是参数使用Column类型进行了封装。
  put(List column)功能同上述put接口,只是参数为多列。
  deleteColumns(String columnName)删除某列,多版本模式下会删除该列全部版本。
  deleteColumn(String columnName, long version)删除某列的指定版本,适用于多版本模式下对特定版本进行删除。
  increment(Column column)对某列进行原子加操作,仅适用于整型类型。
Condition本次更新的条件。可以指定行存在性条件和列条件,列条件比如“某列的值大于5”。rowExistenceExpectation行存在性条件,枚举类型,有以下三种值:
(1) IGNORE:不对行存在性进行判断,默认即为IGNORE。
(2) EXPECT_EXIST: 期望该行存在,若不存在,请求会报错。
(3) EXPECT_NOT_EXIST:期望该行不存在,若存在,请求会报错。
注意:
通常情况下,若没有特殊的设置条件的需求,使用IGNORE即可(保持默认,可不做设置),此时写入性能也更好。
  columnCondition列条件,可以设置单列条件(SingleColumnValueCondition),也可以设置多列组合条件(CompositeColumnValueCondition),具体见条件更新的文档。

UpdateRowResponse参数说明

具体参数说明:

变量类型成员变量或接口说明
Response(基类)requestId本次请求服务端返回的requestId,用于问题调查,建议在出错时打印到业务日志中。
 traceId本次请求SDK生成的traceId,用于问题调查,建议在出错时打印到业务日志中。
UpdateRowResponseconsumedCapacity本次请求消耗的读写CU,用于计费。
 row默认情况下为null,仅当请求中returnType设置为返回PK(RT_PK)或者某列修改后的值(RT_AFTER_MODIFY)时,返回对应的内容。

功能示例

所有示例代码可以在Tablestore-Examples项目中查看。

Github地址:https://github.com/aliyun/tablestore-examples/tree/master/basic/Java/DataManage/src/main/java/com/aliyun/tablestore/basic/dataManage

基本更新操作

UpdateRow接口最常用的场景,是对某一行写入一些列,或者删除一些列。通常,业务使用单版本表比较多,此时可以忽略列上多版本的概念,按照每列只有一个值来理解。此时UpdateRow就是用于新增、修改或删除某些列。

新增:若写入的属性列之前不存在,UpdateRow执行后会新增该列。
修改:若写入的属性列之前已经有值,UpdateRow执行后会修改该列的值。
删除:UpdateRow可以用于删除某些列,若该列之前就不存在,则无影响,不会报错。

示例代码

下面的代码执行一次UpdateRow操作,对某一行新增两列,删除一列。

    public void updateRowNormally() {PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn(PK1, PrimaryKeyValue.fromLong(1L)).addPrimaryKeyColumn(PK2, PrimaryKeyValue.fromString("string")).build();/*** 构造RowUpdateChange,设置表名和主键*/RowUpdateChange rowChange = new RowUpdateChange(TABLE_NAME, primaryKey);/*** 写入两列*/rowChange.put("col_str", ColumnValue.fromString("value1"));rowChange.put("col_long", ColumnValue.fromLong(1));/*** 删除某列*/rowChange.deleteColumns("col_to_delete");/*** 构造UpdateRowRequest*/UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowChange);/*** 调用updateRow接口。若之前该行不存在,系统会新增该行。*/UpdateRowResponse updateRowResponse = syncClient.updateRow(updateRowRequest);/*** 打印requestID*/System.out.printf("UpdateRowSuccess, request id: %s\n", updateRowResponse.getRequestId());}

使用UpdateRow新增、修改或者删除某些列,是最基础的单行数据更新操作,也是很常用的场景。

但在某些场景中,若使用了表格存储Tablestore的多版本功能,可能会有新增或修改某一列的某个特定版本的需求,或者是需要删除某一列的某一个版本,此时就需要指定时间戳来更新或删除,见下面的示例。

指定版本操作

对于设置了保留多版本的表,每一列上都会保留最新的N个版本,UpdateRow可以对其中某个特定版本进行更新,也可以删除某个特定版本。

示例代码

下面的代码执行一次UpdateRow操作,对某一行写入两列,指定版本号写入,同时删除某列的某个版本,也需要指定要删除的版本号。

注意:在指定版本号时,需要保证该版本号在表上设置的最大版本偏差内,若超出该偏差范围,可以调整表上的最大版本偏差设置。

    public void updateRowMultiVersion() {PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn(PK1, PrimaryKeyValue.fromLong(1L)).addPrimaryKeyColumn(PK2, PrimaryKeyValue.fromString("string")).build();/*** 构造RowUpdateChange,设置表名和主键*/RowUpdateChange rowChange = new RowUpdateChange(TABLE_NAME, primaryKey);long version = System.currentTimeMillis();/*** 写入两列,指定版本号。* 若指定的版本之前不存在,则会新增一个版本;若该版本已存在,会修改该版本的值。*/rowChange.put("col_str", ColumnValue.fromString("value1"), version);rowChange.put("col_long", ColumnValue.fromLong(1), version);/*** 删除某列的某一个版本,指定版本号。*/rowChange.deleteColumn("col_to_delete", version);/*** 构造UpdateRowRequest*/UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowChange);/*** 调用updateRow接口。若之前该行不存在,系统会新增该行。*/UpdateRowResponse updateRowResponse = syncClient.updateRow(updateRowRequest);/*** 打印requestID*/System.out.printf("UpdateRowSuccess, request id: %s\n", updateRowResponse.getRequestId());}

条件更新

UpdateRow接口可以设置更新条件,仅当满足条件时才进行更新,条件包括行存在性条件和列条件。

行存在性条件:在更新前检查该行存在或不存在,仅当符合期望时才进行更新操作,否则抛错。

列条件:目前支持 SingleColumnValueCondition 和 CompositeColumnValueCondition,是基于某一列或者某些列的列值进行条件判断,比如“col_long的值应该大于5”等。基于列条件,可以使用表格存储Tablestore实现分布式的乐观锁机制。

条件更新的功能文档:https://help.aliyun.com/document_detail/35194.html

示例代码

设置行存在性条件和列条件:

    public void updateRowWithCondition() {PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn(PK1, PrimaryKeyValue.fromLong(1L)).addPrimaryKeyColumn(PK2, PrimaryKeyValue.fromString("string")).build();/*** 构造RowUpdateChange,设置表名和主键*/RowUpdateChange rowChange = new RowUpdateChange(TABLE_NAME, primaryKey);/*** 设置行存在条件为期望行存在*/Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);/*** 设置列条件,若只需要检查行存在性,可以不设置列条件。** 这里设置列条件为两列的组合条件: "(col_boolean == true) && (col_long > 0)"*/CompositeColumnValueCondition colCondition = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.AND);SingleColumnValueCondition subColCondition1 = new SingleColumnValueCondition("col_boolean",SingleColumnValueCondition.CompareOperator.EQUAL,ColumnValue.fromBoolean(true));subColCondition1.setPassIfMissing(true); // setPassIfMissing(true),表示若该列不存在,也视为满足条件。SingleColumnValueCondition subColCondition2 = new SingleColumnValueCondition("col_long",SingleColumnValueCondition.CompareOperator.GREATER_THAN,ColumnValue.fromLong(0L));colCondition.addCondition(subColCondition1).addCondition(subColCondition2);subColCondition2.setPassIfMissing(false); // setPassIfMissing(false),表示若该列不存在,视为不满足条件。condition.setColumnCondition(colCondition);rowChange.setCondition(condition);/*** 满足条件时,写入两列*/rowChange.put("col_str", ColumnValue.fromString("value1"));rowChange.put("col_long", ColumnValue.fromLong(1));/*** 构造UpdateRowRequest*/UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowChange);/*** 调用updateRow接口。* 若不满足设置的条件,比如该行不存在,或者不满足列条件,会抛OTSException,ErrorCode为"OTSConditionCheckFail".*/UpdateRowResponse updateRowResponse = syncClient.updateRow(updateRowRequest);/*** 打印requestID*/System.out.printf("UpdateRowSuccess, request id: %s\n", updateRowResponse.getRequestId());}

原子计数器

UpdateRow支持对某一整型列进行原子加操作,原子加操作可以原子的对某一整型列的数据进行增量变更操作,比如在原来的基础上加10,或者减5,等等。原子加操作可以用来构造原子计数器。

原子计数器的功能文档:https://help.aliyun.com/document_detail/90949.html

示例代码

    public void updateRowIncrement() {PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn(PK1, PrimaryKeyValue.fromLong(1L)).addPrimaryKeyColumn(PK2, PrimaryKeyValue.fromString("string")).build();/*** 构造RowUpdateChange,设置表名和主键*/RowUpdateChange rowChange = new RowUpdateChange(TABLE_NAME, primaryKey);String columnName = "col_long";/*** 对col_long这一列进行原子加100操作。* 若该列之前不存在,会从0开始累加。*/rowChange.increment(new Column(columnName, ColumnValue.fromLong(100)));/*** 设置返回修改后的该列值。*/rowChange.setReturnType(ReturnType.RT_AFTER_MODIFY);rowChange.addReturnColumn(columnName);/*** 构造UpdateRowRequest*/UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowChange);/*** 调用updateRow接口。若之前该行不存在,系统会新增该行。*/UpdateRowResponse updateRowResponse = syncClient.updateRow(updateRowRequest);/*** 打印修改后的该列的值和RequestId*/System.out.printf("UpdateRowSuccess, column [%s] was updated to %d, request id: %s\n",columnName,updateRowResponse.getRow().getLatestColumn(columnName).getValue().asLong(),updateRowResponse.getRequestId());}


原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给力!一行代码躺赚普通程序员10年薪资!

笔者这两天闲逛知乎&#xff0c;看到了这个帖子&#xff1a;匿名答题&#xff0c;发表于2014年&#xff0c;此外没有留下任何多余信息。2年躺赚200万&#xff0c;相当于普通程序员10年的工资。没想到Pyhon这么强大&#xff0c;怪不得有人说“除了不会生孩子&#xff0c;Python什…

支付宝移动端 Hybrid 解决方案探索与实践

目前 mPaaS H5 容器 Demo 源码已发布至 GitHub&#xff0c;全新的接入方式让你可以一键集成 mPaaS 环境并快速接入 H5 容器&#xff0c;体验统一的容器和内核&#xff0c;获取媲美原生的 Hybrid 方案及完美的动态能力。 支付宝 Hybrid 方案建设与演进 目前支付宝有 2 套 Hybr…

SpringBoot 整合 knife4j

文章目录简述2. 导入依赖3. 创建配置类4. 创建User实体类5. 创建开发接口6. 启动项目简述 Swagger是一款测试文档Api接口&#xff0c;具体用法见SpringBoot整合Swagger。而knife4j是对Swagger进一步封装&#xff0c;其优化了api文档的界面。官网https://doc.xiaominfo.com/kni…

如何将数据仓库从 AWS Redshift 迁移到阿里云 AnalyticDB for PostgreSQL

阿里云AnalyticDB for PostgreSQL&#xff08;以下简称 ADB PG&#xff0c;即原HybridDB for PostgreSQL&#xff09;为基于PostgreSQL内核的MPP架构的实时数据仓库服务&#xff0c;可以支持复杂ETL任务&#xff0c;也支持高性能在线查询&#xff0c;同阿里云生态紧密结合。AWS…

开源项目如何挣钱? Spark 商业化公司创始人曝光心路历程

众所周知&#xff0c;开源项目对软件发展来说至关重要&#xff0c;但仍有人认为用开源项目来赚钱是对开源项目的一种亵渎。HashiCorp联合创始人兼 CTO Armon Dadgar、Databricks CEO Ali Ghodsi 和 a16z 的普通合伙人 Peter Levine 齐聚一堂&#xff0c;详细阐述开源项目变成商…

F1 Query: Declarative Querying at Scale

距离 Google 的上一篇 F1 论文&#xff0c;也就是 F1: A Distributed SQL Database That Scales 已经 5 年过去了&#xff0c;Google 在今年的 VLDB 上终于发布了 F1 的新版本 F1 Query: Declarative Querying at Scale&#xff0c;我们今天就来看一下这篇论文。 2013 年的 F1…

openoffice 安装windows 环境

文章目录一、安装配置启动1. 下载软件2. 安装3. 启动一、安装配置启动 1. 下载软件 https://www.openoffice.org/download/ 4.1.11版本 下载链接 2. 安装 一路下一步安装即可 安装完毕后&#xff0c;在桌面上会有一个openoffice图标 3. 启动 soffice -headless -accept“…

在线看大会!就来云栖号!

背景 抗击2019新型冠状病毒&#xff08;2019-nCoV冠状病毒&#xff09;成了全国人民的头等大事。截至2020年2月7日&#xff0c;中国确诊新型冠状病毒感染者逾3万人。为抗击预防新型冠状病毒&#xff0c;武汉采取封城措施&#xff0c;钟南山院士提倡全家在家不出门隔断病源&…

我为什么放弃Java,却选择Python?

不可否认的是&#xff0c;Python 凭借超广泛的应用方向&#xff0c;已成为了最受欢迎的编程语言。不过&#xff0c;真正让我喜欢上 Python 的原因&#xff0c;是我发现做同样功能的代码&#xff0c;从 Java 换成 Python 以后&#xff0c;代码量直接从 2000 行减少到 200 行。甚…

三大场景,对象存储OSS带你快速上云

本文介绍对象存储OSS的主要应用场景。 图片和音视频等应用的海量存储 OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。OSS支持流式写入和文件写入两种方式。 网页或者移动应用的静态和动态资源分离 利用海…

word、excel、ppt 办公文件 在线预览

如果想要免费的&#xff0c;可以用 openoffice&#xff0c;实现原理就是&#xff1a; 通过第三方工具openoffice&#xff0c;将word、excel、ppt、txt等文件转换为pdf文件流&#xff1b;当然如果装了Adobe Reader XI&#xff0c;那把pdf直接拖到浏览器页面就可以直接打开预览&a…

生成PDF乱码问题

文章目录1. 准备字体2. 安装字体3. 重启服务器1. 准备字体 将Windows下的Fonts&#xff0c;如&#xff1a;C:\Windows\Fonts&#xff0c;压缩成Fonts.zip压缩包 2. 安装字体 将压缩包拷贝到Linux目录下&#xff0c;执行如下命令即可&#xff1a; unzip Fonts.zip mkdir /u…

30 年开源老兵,10 年躬耕 OpenStack,开源 1000 万行核心代码

受访者 | Jonathan Bryce记者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;万物互联时代下&#xff0c;我们的一切都在依赖计算基础设施&#xff0c;科学、金融、政府、教育、通信和医疗保健依赖现代云基础设施来运行和改进。而开源是让全世界大多数人获…

力展物流公司上云 低成本、实例资源使用效率提升

公司介绍 我们公司是成都力展供应链管理有限公司&#xff0c;于2019年4月注册&#xff0c;注册资金1000万&#xff0c;并于2019年6月投资了四川力展物流有限责任公司和成都力展鸿翔物流有限公司&#xff0c;分别入股900W和400W。业务痛点 我们公司成立不久&#xff0c;但动作频…

OpenOffice+JodConverter实现Office文件到PDF的转换

文章目录1. OpenOffice 下载、安装、启动2. JodConverter下载3. 文件转化4. 中文乱码5. 解决中文乱码1. OpenOffice 下载、安装、启动 openoffice 安装 linux环境 2. JodConverter下载 JodConverter是一款利用OpenOffice进行转化的工具&#xff0c;可以在Office文件和OpenOff…

OpenInfra Days China 2020大会议程已上线!

距离OpenInfra Days China 2020线上活动开幕还有不到半个月的时间&#xff0c;议题征集与筛选工作已于七月底正式结束&#xff0c;目前大会议程已正式公布&#xff01; 本次OpenInfra Days China主题演讲由OpenStack基金会执行董事Jonathan Bryce&#xff0c;中国电子技术标准化…

阿里云高校“在家实践”计划,免费提供2.68亿小时算力!

计划简介 新冠肺炎疫情防控阻击战持续推进&#xff0c;为全力配合教育部延期开学&#xff0c;高校在线上课共同抗击疫情&#xff0c;阿里云弹性计算联合开发者社区紧急上线高校师生“在家实践”计划&#xff0c;向全国高校学生、教师免费提供2.68亿小时云服务器ECS算力&#xf…

启迪公交上云助力北京公交二维码乘车业务系统顺利上线

公司介绍 我们公司是国内领先的公交出行服务提供商&#xff0c;通过承接公交信息化和智慧化项目建设&#xff0c;应用最先进的互联网商业模式&#xff0c;将“人、车、线、站”的大数据资源及相关配套资源进行商业化转换&#xff0c;实现行业引领&#xff0c;提升公交系统的创新…

MVC与MVVM的区别

MVC与MVVM MVC是Model-View- Controller的简写&#xff1a;模型(model) 视图(view) 控制器(controller) ​ Model&#xff08;模型&#xff09;&#xff1a;是应用程序中用于处理应用程序数据逻辑的部分。 ​ View&#xff08;视图&#xff09;&#xff1a;是应用程序中处理…

项目 接入 在线预览

文章目录1. 项目链接2. 克隆项目3. 接入规范4. 项目接入测试5. 参考案例1. 项目链接 https://gitee.com/kekingcn/file-online-preview 2. 克隆项目 git clone gitgitee.com:kekingcn/file-online-preview.git3. 接入规范 # 如果你的项目需要接入文件预览项目&#xff0c;…