TableStore:多行数据操作
1、批量写
public static void batchWriteRow(SyncClient client) {
BatchWriteRowRequest request = new BatchWriteRowRequest();
//RowPut
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(99));
RowPutChange rowPutChange = new RowPutChange("note",primaryKeyBuilder.build());
//添加一些列
rowPutChange.addColumn(new Column("intattr", ColumnValue.fromLong(123)));
rowPutChange.addColumn(new Column("strattr", ColumnValue.fromString("string 1"), System.currentTimeMillis()));
rowPutChange.addColumn(new Column("strattr", ColumnValue.fromString("string 23345"),System.currentTimeMillis() + 10));
request.addRowChange(rowPutChange);
//RowDelete
PrimaryKeyBuilder primaryKeyBuilder2 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder2.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(2));
RowDeleteChange rowDeleteChange = new RowDeleteChange("note",primaryKeyBuilder2.build());
request.addRowChange(rowDeleteChange);
//RowUpdate
PrimaryKeyBuilder primaryKeyBuilder3 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder3.addPrimaryKeyColumn("noteid",PrimaryKeyValue.fromLong(1));
RowUpdateChange rowUpdateChange = new RowUpdateChange("note", primaryKeyBuilder3.build());
rowUpdateChange.put("day",ColumnValue.fromString("修改后的day")); rowUpdateChange.deleteColumns("month");
request.addRowChange(rowUpdateChange);
//另一个表的RowPut
PrimaryKeyBuilder keyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
keyBuilder.addPrimaryKeyColumn("userid",PrimaryKeyValue.fromLong(20));
keyBuilder.addPrimaryKeyColumn("userguid",PrimaryKeyValue.fromString("121212323"));
keyBuilder.addPrimaryKeyColumn("userauto",PrimaryKeyValue.AUTO_INCREMENT);
RowPutChange rowPutChange2 = new RowPutChange("user", keyBuilder.build());
request.addRowChange(rowPutChange2);
BatchWriteRowResponse batchWriteRowResponse = client.batchWriteRow(request);
System.out.println("是否全部成功:" + batchWriteRowResponse.isAllSucceed());
if(!batchWriteRowResponse.isAllSucceed()) {
for(RowResult rowResult : batchWriteRowResponse.getFailedRows()) {
System.out.println("失败的行:" + request.getRowChange(rowResult.getTableName(),rowResult.getIndex()).getPrimaryKey());
System.out.println("失败原因:" + rowResult.getError());
}
}
//可以通过createRequestForRetry方法再构造一个请求对失败的行进行重试.这里只给出构造重试请求的部分.
//推荐的重试方法是使用SDK的自定义重试策略功能, 支持对batch操作的部分行错误进行重试. 设定重试策略后, 调用接口处即不需要增加重试代码.
//BatchWriteRowRequest retryRequest = request.createRequestForRetry(batchWriteRowResponse.getFailedRows());
}
2、批量读
private static void batchGetRow(SyncClient client) {
BatchGetRowRequest batchGetRowRequest = new BatchGetRowRequest();
MultiRowQueryCriteria multiRowQueryCriteria = new MultiRowQueryCriteria("note");
// 加入要读的行
PrimaryKeyBuilder keyBuilder1 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
keyBuilder1.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(1));
PrimaryKey key1 = keyBuilder1.build();
PrimaryKeyBuilder keyBuilder2 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
keyBuilder2.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(99));
PrimaryKey key2 = keyBuilder2.build();
multiRowQueryCriteria.addRow(key1);
multiRowQueryCriteria.addRow(key2);
// 添加条件
multiRowQueryCriteria.setMaxVersions(1);
String[] colsStrings = { "noteid", "day", "year" };
multiRowQueryCriteria.addColumnsToGet(colsStrings);
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("year",
SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(2019));
singleColumnValueFilter.setPassIfMissing(false);
multiRowQueryCriteria.setFilter(singleColumnValueFilter);
batchGetRowRequest.addMultiRowQueryCriteria(multiRowQueryCriteria);
MultiRowQueryCriteria multiRowQueryCriteria2 = new MultiRowQueryCriteria("testdb");
multiRowQueryCriteria2.setMaxVersions(1);
PrimaryKeyBuilder keyBuilder3 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
keyBuilder3.addPrimaryKeyColumn("testid", PrimaryKeyValue.fromLong(1));
PrimaryKey key3 = keyBuilder3.build();
multiRowQueryCriteria2.addRow(key3);
batchGetRowRequest.addMultiRowQueryCriteria(multiRowQueryCriteria2);
BatchGetRowResponse batchGetRowResponse = client.batchGetRow(batchGetRowRequest);
System.out.println("是否全部成功:" + batchGetRowResponse.isAllSucceed());
if (!batchGetRowResponse.isAllSucceed()) {
for (RowResult rowResult : batchGetRowResponse.getFailedRows()) {
System.out.println(
"失败的行:" + batchGetRowRequest.getPrimaryKey(rowResult.getTableName(), rowResult.getIndex()));
System.out.println("失败原因:" + rowResult.getError());
}
}
List<RowResult> results = batchGetRowResponse.getSucceedRows();
for (RowResult rowResult : results) {
Row row = rowResult.getRow();
if (row != null) {
Column[] columns = row.getColumns();
for (Column column : columns) {
System.out.println("Name:" + column.getName() + " Value:" + column.getValue() + "\n");
}
}
}
List<RowResult> results1 = batchGetRowResponse.getBatchGetRowResult("note");
for (RowResult rowResult : results1) {
Row row = rowResult.getRow();
if (row != null) {
Column[] columns = row.getColumns();
for (Column column : columns) {
System.out.println("Name:" + column.getName() + " Value:" + column.getValue() + "\n");
}
}
}
List<RowResult> results2 = batchGetRowResponse.getBatchGetRowResult("testdb");
for (RowResult rowResult : results2) {
Row row = rowResult.getRow(); if (row != null) {
Column[] columns = row.getColumns();
for (Column column : columns) {
System.out.println("Name:" + column.getName() + " Value:" + column.getValue() + "\n");
}
}
}
// 可以通过createRequestForRetry方法再构造一个请求对失败的行进行重试.这里只给出构造重试请求的部分.
// 推荐的重试方法是使用SDK的自定义重试策略功能, 支持对batch操作的部分行错误进行重试. 设定重试策略后, 调用接口处即不需要增加重试代码.
// BatchGetRowRequest retryRequest =
// batchGetRowRequest.createRequestForRetry(batchGetRowResponse.getFailedRows());
}
因为不通过条件的查询都会返回null,务必记得对Row做null检查。
3、范围读
设置起止主键,查找此范围内的数据,当数据量过大无法一次读取完时,会返回下一个主键位置,接着读取。
public static void getRange(SyncClient client) throws IOException {
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("note");
//设置起始主键
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(20));
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
//设置结果主键
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(1));
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
//反序读
rangeRowQueryCriteria.setDirection(Direction.BACKWARD);
rangeRowQueryCriteria.setMaxVersions(1);
while (true) {
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
for(Row row : getRangeResponse.getRows()) {
PrimaryKeyColumn[] pks = row.getPrimaryKey().getPrimaryKeyColumns();
Column pkColumn = pks[0].toColumn();
System.out.println("noteid:" + pkColumn.getValue());
Column[] columns = row.getColumns();
for(Column column : columns) {
System.out.println(" Name:" + column.getName() + " Value:" + column.getValue());
}
}
if(getRangeResponse.getNextStartPrimaryKey() != null) {
System.out.println("--------nextStartPrimaryKey不为空,则继续读取---------");
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
}else {
break;
}
}
}
4、迭代读
public static void getRangeByIterator(SyncClient client) throws IOException {
RangeIteratorParameter rangeIteratorParameter = new RangeIteratorParameter("note");
//设置起始主键
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(20));
rangeIteratorParameter.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
//设置结果主键
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("noteid", PrimaryKeyValue.fromLong(1));
rangeIteratorParameter.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
rangeIteratorParameter.setDirection(Direction.BACKWARD);
rangeIteratorParameter.setMaxVersions(1);
Iterator<Row> iterator = client.createRangeIterator(rangeIteratorParameter);
while (iterator.hasNext()) {
Row row = iterator.next();
PrimaryKeyColumn[] pks = row.getPrimaryKey().getPrimaryKeyColumns();
Column pkColumn = pks[0].toColumn();
System.out.println("noteid:" + pkColumn.getValue());
Column[] columns = row.getColumns();
for(Column column : columns) {
System.out.println(" Name:" + column.getName() + " Value:" + column.getValue());
}
}
}
TableStore:多行数据操作的更多相关文章
- MySQL命令行数据操作使用心得(总结版)
Char 0~255 Varchar 0~65535 text 0~65535(只能保存字符) Longtext 0~4294967295(只能保存字符) CMD登陆mysql mysql -u ro ...
- FunDA(2)- Streaming Data Operation:流式数据操作
在上一集的讨论里我们介绍并实现了强类型返回结果行.使用强类型主要的目的是当我们把后端数据库SQL批次操作搬到内存里转变成数据流式按行操作时能更方便.准确.高效地选定数据字段.在上集讨论示范里我们用集合 ...
- hive数据操作
mdl是数据操作类的语言,包括向数据表加载文件,写查询结果等操作 hive有四种导入数据的方式 >从本地加载数据 LOAD DATA LOCAL INPATH './examples/files ...
- Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页
models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...
- SQL不同服务器数据库之间的数据操作整理(完整版)
---------------------------------------------------------------------------------- -- Author : htl25 ...
- C#利用SqlDataAdapte对DataTable进行批量数据操作
C#利用SqlDataAdapte对DataTable进行批量数据操作,可以让我们大大简化操作数据的代码量,我们几乎不需要循环和不关心用户到底是新增还是修改,更不用编写新增和修改以及删除的SQL语句, ...
- [转]Mysql命令行常用操作
Mysql命令行常用操作 一.从命令行登录MySQL数据库服务器 1.登录使用默认3306端口的MySQL /usr/local/mysql/bin/mysql -u root -p 2.通过TCP连 ...
- oracle-2-sql数据操作和查询
主要内容: >oracle 数据类型 >sql建表和约束 >sql对数九的增删改 >sql查询 >oracle伪例 1.oracle的数据类型 oracle数据库的核心是 ...
- (转)SQLLite数据操作
原文:http://dreamboy.blog.51cto.com/3180937/722352 SQLLite数据操作 一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存 ...
随机推荐
- docker for mac 安装 kubernetes、kubernetes dashboard
安装参考地址(按照此文档,安装成功):https://yq.aliyun.com/articles/508460 官方说明:https://kubernetes.io/docs/tasks/acces ...
- redis String结构
1. 设置c的过期时间为100s 2. psetex的单位为毫秒 10000毫秒 3. getrange 获得字符的范围 4. getset 先获得旧的值,然后设置新的值 5. 设置多个值 6. 获得 ...
- 深入理解ASP.NET MVC(3)
系列目录 URL是如何通过路由表生成的(outbound) 通常我们被推荐在view设计时使用Html.ActionLink(…)产生链接,这样做的优势就是,url可以根据路由表生成.路由机制的另一个 ...
- 读DataSnap源代码(四)
继续篇中的 function TCustomWebDispatcher.DispatchAction(Request: TWebRequest; Response: TWebResponse): Bo ...
- HanLP用户自定义词典源码分析详解
1. 官方文档及参考链接 l 关于词典问题Issue,首先参考:FAQ l 自定义词典其实是基于规则的分词,它的用法参考这个issue l 如果有些数量词.字母词需要分词,可参考:P2P和C2C这种词 ...
- JAVAFX开发桌面应用
javafx中文版文档: http://www.yiibai.com/javafx/ JavaFX之FXController详解 JavaFx系列教程 含打包部署 javafx之两种局部界面的呈现方式 ...
- ML: 聚类算法-概论
聚类分析是一种重要的人类行为,早在孩提时代,一个人就通过不断改进下意识中的聚类模式来学会如何区分猫狗.动物植物.目前在许多领域都得到了广泛的研究和成功的应用,如用于模式识别.数据分析.图像处理.市场研 ...
- 关于vivado----xdc文件时钟约束的初识
关于vivado----xdc文件时钟约束的初识 1.Primary Clocks(主时钟) 然而,对于比较复杂的时钟: 2.某个模块采用的主时钟(比如说GT) 3.时钟分频 4.复杂一点的时钟描述 ...
- 黄聪:多个wordpress网站(不同域名)共享用户数据的方法
WordPress可以自定义用户数据表,这样多个wordpress网站就可以共享用户数据了,有时候这是非常方便的,这些Wordpress站点应该安装在同一个数据库下,数据表前缀各不相同.由于Wordp ...
- LeetCode——4. Median of Two Sorted Arrays
一.题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays 二.题目大意: 给定两个排序过的数组,求出两个数组的中位数,要求时间复 ...