tableStore更新时,必须有PK

总结:
这个东西本身可能技术还不成熟,使用的人少,有问题很难解决

遇到的问题:
(1)没有一个GUI工具,使用门槛高
(2)查询的GetRange不方便,把查询出来的数据使用System.out.println打印出来的是乱码
(3)batch insert时报错及解析:

表格存储Table Store限制项:https://help.aliyun.com/knowledge_detail/38573.html

BatchGetRow 一次操作请求读取的行数 不超过 100 N/A
BatchWriteRow 一次操作请求写入行数 不超过 200 N/A
BatchWriteRow 一次操作的数据大小 不超过 4 MB N/A
GetRange 一次返回的数据 5000 行或者 4 MB 一次返回数据的行数超过 5000 行,或者返回数据的数据大小大于 4 MB。以上任一条件满足时,超出上限的数据将会按行级别被截掉并返回下一行数据主键信息
一次 HTTP 请求 Request Body 的数据大小 不超过 5 MB

  1. <dependency>
  2. <groupId>com.aliyun.openservices</groupId>
  3. <artifactId>tablestore</artifactId>
  4. <version>4.2.1</version>
  5. </dependency>
  1. 2017-05-18 18:14:55.520 ERROR [http-nio-5000-exec-1]com.xiaoyi.app.tool.car.service.BatchService -/862442030078001_2378171_1.2.0_1493620263150.tar.gz,contentLength:2238,Rows count exceeds the upper limit: 200.
  2. com.alicloud.openservices.tablestore.TableStoreException: Rows count exceeds the upper limit: 200.
  3. at com.alicloud.openservices.tablestore.core.CallbackImpledFuture.getResultWithoutLock(CallbackImpledFuture.java:107)
  4. at com.alicloud.openservices.tablestore.core.CallbackImpledFuture.get(CallbackImpledFuture.java:78)
  5. at com.alicloud.openservices.tablestore.SyncClient.waitForFuture(SyncClient.java:249)
  6. at com.alicloud.openservices.tablestore.SyncClient.batchWriteRow(SyncClient.java:187)
  7. at com.xiaoyi.app.business.car.biz.CarGpsBiz.insertList(CarGpsBiz.java:61)
  8. at com.xiaoyi.app.business.car.biz.CarGpsBiz$$FastClassBySpringCGLIB$$c43f0f59.invoke(<generated>)
  9. at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
  10. at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
  11. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
  12. at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
  13. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
  14. at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
  15. at com.xiaoyi.app.core.car.aop.CatAspect.doServerAround(CatAspect.java:46)
  16. at sun.reflect.GeneratedMethodAccessor70.invoke(Unknown Source)
  17. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  18. at java.lang.reflect.Method.invoke(Method.java:497)
  19. at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
  20. at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
  21. at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
  22. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
  23. at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
  24. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
  25. at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
  26. at com.xiaoyi.app.business.car.biz.CarGpsBiz$$EnhancerBySpringCGLIB$$6c9a8019.insertList(<generated>)
  27. at com.xiaoyi.app.tool.car.service.BatchService.handle(BatchService.java:86)
  28. at com.xiaoyi.app.tool.car.restful.GatherController.gatherOss(GatherController.java:85)
  29. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  30. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  31. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  32. at java.lang.reflect.Method.invoke(Method.java:497)
  33. at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
  34. at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
  35. at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
  36. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
  37. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
  38. at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
  39. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
  40. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
  41. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
  42. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
  43. at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
  44. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
  45. at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
  46. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
  47. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  48. at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  49. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  50. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  51. at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
  52. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  53. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  54. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  55. at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
  56. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  57. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  58. at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
  59. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  60. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  61. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  62. at com.dianping.cat.servlet.CatFilter$Context.handle(CatFilter.java:332)
  63. at com.dianping.cat.servlet.CatFilter$CatHandler$2.handle(CatFilter.java:120)
  64. at com.dianping.cat.servlet.CatFilter$Context.handle(CatFilter.java:330)
  65. at com.dianping.cat.servlet.CatFilter$CatHandler$3.handle(CatFilter.java:137)
  66. at com.dianping.cat.servlet.CatFilter$Context.handle(CatFilter.java:330)
  67. at com.dianping.cat.servlet.CatFilter$CatHandler$4.handle(CatFilter.java:266)
  68. at com.dianping.cat.servlet.CatFilter$Context.handle(CatFilter.java:330)
  69. at com.dianping.cat.servlet.CatFilter$CatHandler$1.handle(CatFilter.java:73)
  70. at com.dianping.cat.servlet.CatFilter$Context.handle(CatFilter.java:330)
  71. at com.dianping.cat.servlet.CatFilter.doFilter(CatFilter.java:40)
  72. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  73. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  74. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
  75. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  76. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  77. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  78. at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
  79. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  80. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  81. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  82. at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
  83. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  84. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  85. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  86. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
  87. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  88. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  89. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  90. at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
  91. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  92. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  93. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  94. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
  95. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
  96. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
  97. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
  98. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
  99. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
  100. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
  101. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
  102. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
  103. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
  104. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
  105. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
  106. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  107. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  108. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  109. at java.lang.Thread.run(Thread.java:745)
  110. Caused by: com.alicloud.openservices.tablestore.TableStoreException: Rows count exceeds the upper limit: 200.
  111. at com.alicloud.openservices.tablestore.core.http.ErrorResponseHandler.handle(ErrorResponseHandler.java:56)
  112. at com.alicloud.openservices.tablestore.core.http.ResponseConsumer.getResponseContentWithMeta(ResponseConsumer.java:95)
  113. at com.alicloud.openservices.tablestore.core.http.BatchWriteRowResponseConsumer.parseResult(BatchWriteRowResponseConsumer.java:65)
  114. at com.alicloud.openservices.tablestore.core.http.BatchWriteRowResponseConsumer.parseResult(BatchWriteRowResponseConsumer.java:18)
  115. at com.alicloud.openservices.tablestore.core.http.ResponseConsumer.buildResult(ResponseConsumer.java:74)
  116. at org.apache.http.nio.protocol.AbstractAsyncResponseConsumer.responseCompleted(AbstractAsyncResponseConsumer.java:157)
  117. at org.apache.http.impl.nio.client.MainClientExec.responseCompleted(MainClientExec.java:383)
  118. at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:172)
  119. at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:437)
  120. at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:327)
  121. at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265)
  122. at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
  123. at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
  124. at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114)
  125. at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
  126. at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
  127. at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
  128. at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
  129. at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
  130. at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)
  131. ... 1 common frames omitted
  132. 2017-05-18 18:16:30.430 ERROR [http-nio-5000-exec-1

如何高效存储海量GPS数据:https://yq.aliyun.com/articles/74460
从SQL到NoSQL—如何使用表格存储  https://yq.aliyun.com/articles/64411
使用MaxCompute访问TableStore(OTS) 简明手册   https://yq.aliyun.com/articles/72075
表格存储数据模型和查询操作   https://yq.aliyun.com/articles/38621

sdk:
表操作:https://help.aliyun.com/document_detail/43012.html?spm=5176.doc43017.6.692.FqI5C4
多行数据操作:https://help.aliyun.com/document_detail/43017.html

主键列自增:https://help.aliyun.com/document_detail/47731.html?spm=5176.doc43012.6.697.MeAkYn
最佳实践,表操作:https://help.aliyun.com/document_detail/27356.html?spm=5176.2020520106.122.1.mc3CbL
最佳实践,过滤器:https://helpcdn.aliyun.com/document_detail/35193.html?spm=5176.doc35194.6.594.A3mFNT
api 多行数据操作: https://help.aliyun.com/document_detail/43017.html?spm=5176.doc27283.6.694.tZydZm
api表格存储:GetRange  https://help.aliyun.com/document_detail/27309.html?spm=5176.doc27304.6.629.S7OXV5

  1. import com.alicloud.openservices.tablestore.ClientConfiguration;
  2. import com.alicloud.openservices.tablestore.ClientException;
  3. import com.alicloud.openservices.tablestore.SyncClient;
  4. import com.alicloud.openservices.tablestore.TableStoreException;
  5. import com.alicloud.openservices.tablestore.model.*;
  6. import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueFilter;
  7. import com.xiaoyi.app.business.car.biz.CarGpsBiz;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.stereotype.Component;
  11.  
  12. import java.util.List;
  13.  
  14. /**
  15. * Created by tang.cheng on 2017/5/18.
  16. */
  17. @Component
  18. public class TableStoreUtil {
  19.  
  20. private static final String TABLE_NAME = "tt_test";
  21. private static final String PRIMARY_KEY_NAME = "pk_id";
  22. private static final Logger LOGGER = LoggerFactory.getLogger(TableStoreUtil.class);
  23.  
  24. public static void main(String[] args) throws InterruptedException {
  25.  
  26. final String endPoint = "";
  27. final String accessKeyId = "";
  28. final String accessKeySecret = "";
  29. final String instanceName = "tt_test_instance";
  30. // ClientConfiguration提供了很多配置项,以下只列举部分。
  31. ClientConfiguration clientConfiguration = new ClientConfiguration();
  32. // 设置建立连接的超时时间。
  33. clientConfiguration.setConnectionTimeoutInMillisecond(5000);
  34. // 设置socket超时时间。
  35. clientConfiguration.setSocketTimeoutInMillisecond(5000);
  36. // 设置重试策略,若不设置,采用默认的重试策略。
  37. clientConfiguration.setRetryStrategy(new AlwaysRetryStrategy());
  38. SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret,
  39. instanceName, clientConfiguration);
  40. try {
  41. // createTable(client, CarGpsBiz.TABLE_NAME);
  42.  
  43. batchRange(client, CarGpsBiz.TABLE_NAME);
  44. // deleteTable(client, CarGpsBiz.TABLE_NAME);
  45. /* createTable(client);
  46. TimeUnit.SECONDS.sleep(10);*/
  47. // listTable(client);
  48. // describeTable(client);
  49. // deleteTable(client,"sampleTable");
  50. // deleteTable(client,"sampleTable2");
  51. /* batchWriteRow(client);
  52. System.out.println("==============batchGetRow==============");
  53. batchGetRow(client);*/
  54. } catch (TableStoreException e) {
  55. System.err.println("操作失败,详情:" + e.getMessage());
  56. System.err.println("Request ID:" + e.getRequestId());
  57. } catch (ClientException e) {
  58. System.err.println("请求失败,详情:" + e.getMessage());
  59. } catch (Exception e) {
  60. e.printStackTrace();
  61. } finally {
  62. // deleteTable(client);
  63. }
  64.  
  65. }
  66.  
  67. public static void batchRange(SyncClient client, String tableName) {
  68. // 等同于 SELECT * FROM UserHistory WHERE user_id = '10100'
  69. RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(tableName);
  70. // 设置起始主键
  71. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  72. String imei = "/862442030051651";
  73. primaryKeyBuilder.addPrimaryKeyColumn("partition_key", PrimaryKeyValue.INF_MIN);
  74. primaryKeyBuilder.addPrimaryKeyColumn("imei", PrimaryKeyValue.INF_MIN);
  75. primaryKeyBuilder.addPrimaryKeyColumn("time", PrimaryKeyValue.INF_MIN);
  76. primaryKeyBuilder.addPrimaryKeyColumn("tid", PrimaryKeyValue.INF_MIN);
  77. rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
  78.  
  79. // 设置结束主键
  80. primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  81. primaryKeyBuilder.addPrimaryKeyColumn("partition_key", PrimaryKeyValue.INF_MAX);
  82. primaryKeyBuilder.addPrimaryKeyColumn("imei", PrimaryKeyValue.INF_MAX);
  83. primaryKeyBuilder.addPrimaryKeyColumn("time", PrimaryKeyValue.INF_MAX);
  84. primaryKeyBuilder.addPrimaryKeyColumn("tid", PrimaryKeyValue.INF_MAX);
  85. rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
  86.  
  87. // 设置读取最新版本
  88. rangeRowQueryCriteria.setMaxVersions(1);
  89.  
  90. // 默认读取所有的属性列
  91. GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
  92. List<Row> rows = getRangeResponse.getRows();
  93. System.out.println("rows size:" + rows.size());
  94. for (int i = 0; i < 2; i++) {
  95. for (Column column : rows.get(i).getColumns()) {
  96. LOGGER.info("{},{}", column.getName(), column.getValue());
  97. }
  98. }
  99. }
  100.  
  101. public static void createTable(SyncClient client, String tableName) {
  102. TableMeta tableMeta = new TableMeta(tableName);
  103. tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("partition_key", PrimaryKeyType.STRING));
  104. tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("imei", PrimaryKeyType.STRING));
  105. tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("time", PrimaryKeyType.INTEGER));
  106. tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("tid", PrimaryKeyType.INTEGER));
  107.  
  108. int timeToLive = 182 * 24 * 3600; // 数据的过期时间, 单位秒, -1代表永不过期. 假如设置过期时间为一年, 即为 365 * 24 * 3600.
  109. int maxVersions = 3; // 保存的最大版本数, 设置为3即代表每列上最多保存3个最新的版本.
  110.  
  111. TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
  112. CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
  113. client.createTable(request);
  114. }
  115.  
  116. public static void listTable(SyncClient client) {
  117. ListTableResponse response = client.listTable();
  118. System.out.println("表的列表如下:");
  119. for (String tableName : response.getTableNames()) {
  120. System.out.println(tableName);
  121. }
  122. }
  123.  
  124. public static void deleteTable(SyncClient client, String tableName) {
  125. DeleteTableRequest request = new DeleteTableRequest(tableName);
  126. client.deleteTable(request);
  127. }
  128.  
  129. public static void describeTable(SyncClient client) {
  130. DescribeTableRequest request = new DescribeTableRequest(TABLE_NAME);
  131. DescribeTableResponse response = client.describeTable(request);
  132.  
  133. TableMeta tableMeta = response.getTableMeta();
  134. System.out.println("表的名称:" + tableMeta.getTableName());
  135. System.out.println("表的主键:");
  136. for (PrimaryKeySchema primaryKeySchema : tableMeta.getPrimaryKeyList()) {
  137. System.out.println(primaryKeySchema);
  138. }
  139. TableOptions tableOptions = response.getTableOptions();
  140. System.out.println("表的TTL:" + tableOptions.getTimeToLive());
  141. System.out.println("表的MaxVersions:" + tableOptions.getMaxVersions());
  142. ReservedThroughputDetails reservedThroughputDetails = response.getReservedThroughputDetails();
  143. System.out.println("表的预留读吞吐量:"
  144. + reservedThroughputDetails.getCapacityUnit().getReadCapacityUnit());
  145. System.out.println("表的预留写吞吐量:"
  146. + reservedThroughputDetails.getCapacityUnit().getWriteCapacityUnit());
  147. }
  148.  
  149. public static void batchWriteRow(SyncClient client) {
  150. BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
  151.  
  152. // 构造rowPutChange1
  153. PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  154. pk1Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk1"));
  155. RowPutChange rowPutChange1 = new RowPutChange(TABLE_NAME, pk1Builder.build());
  156. // 添加一些列
  157. for (int i = 0; i < 10; i++) {
  158. rowPutChange1.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
  159. }
  160. // 添加到batch操作中
  161. batchWriteRowRequest.addRowChange(rowPutChange1);
  162.  
  163. // 构造rowPutChange2
  164. PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  165. pk2Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk2"));
  166. RowPutChange rowPutChange2 = new RowPutChange(TABLE_NAME, pk2Builder.build());
  167. // 添加一些列
  168. for (int i = 0; i < 10; i++) {
  169. rowPutChange2.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
  170. }
  171. // 添加到batch操作中
  172. batchWriteRowRequest.addRowChange(rowPutChange2);
  173.  
  174. // 构造rowUpdateChange
  175. PrimaryKeyBuilder pk3Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  176. pk3Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk3"));
  177. RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, pk3Builder.build());
  178. // 添加一些列
  179. for (int i = 0; i < 10; i++) {
  180. rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
  181. }
  182. // 删除一列
  183. rowUpdateChange.deleteColumns("Col10");
  184. // 添加到batch操作中
  185. batchWriteRowRequest.addRowChange(rowUpdateChange);
  186.  
  187. // 构造rowDeleteChange
  188. PrimaryKeyBuilder pk4Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  189. pk4Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk4"));
  190. RowDeleteChange rowDeleteChange = new RowDeleteChange(TABLE_NAME, pk4Builder.build());
  191. // 添加到batch操作中
  192. batchWriteRowRequest.addRowChange(rowDeleteChange);
  193. BatchWriteRowResponse response = client.batchWriteRow(batchWriteRowRequest);
  194. System.out.println("是否全部成功:" + response.isAllSucceed());
  195. if (!response.isAllSucceed()) {
  196. for (BatchWriteRowResponse.RowResult rowResult : response.getFailedRows()) {
  197. System.out.println("失败的行:" + batchWriteRowRequest.getRowChange(rowResult.getTableName(), rowResult.getIndex()).getPrimaryKey());
  198. System.out.println("失败原因:" + rowResult.getError());
  199. }
  200. /**
  201. * 可以通过createRequestForRetry方法再构造一个请求对失败的行进行重试.这里只给出构造重试请求的部分.
  202. * 推荐的重试方法是使用SDK的自定义重试策略功能, 支持对batch操作的部分行错误进行重试. 设定重试策略后, 调用接口处即不需要增加重试代码.
  203. */
  204. BatchWriteRowRequest retryRequest = batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
  205. }
  206. }
  207.  
  208. private static void batchGetRow(SyncClient client) {
  209. MultiRowQueryCriteria multiRowQueryCriteria = new MultiRowQueryCriteria(TABLE_NAME);
  210. // 加入10个要读取的行
  211. for (int i = 0; i < 10; i++) {
  212. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  213. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk" + i));
  214. PrimaryKey primaryKey = primaryKeyBuilder.build();
  215. multiRowQueryCriteria.addRow(primaryKey);
  216. }
  217. // 添加条件
  218. multiRowQueryCriteria.setMaxVersions(1);
  219. multiRowQueryCriteria.addColumnsToGet("Col0");
  220. multiRowQueryCriteria.addColumnsToGet("Col1");
  221. SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
  222. SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
  223. singleColumnValueFilter.setPassIfMissing(false);
  224. multiRowQueryCriteria.setFilter(singleColumnValueFilter);
  225.  
  226. BatchGetRowRequest batchGetRowRequest = new BatchGetRowRequest();
  227. // batchGetRow支持读取多个表的数据, 一个multiRowQueryCriteria对应一个表的查询条件, 可以添加多个multiRowQueryCriteria.
  228. batchGetRowRequest.addMultiRowQueryCriteria(multiRowQueryCriteria);
  229.  
  230. BatchGetRowResponse batchGetRowResponse = client.batchGetRow(batchGetRowRequest);
  231.  
  232. System.out.println("是否全部成功:" + batchGetRowResponse.isAllSucceed());
  233. if (!batchGetRowResponse.isAllSucceed()) {
  234. for (BatchGetRowResponse.RowResult rowResult : batchGetRowResponse.getFailedRows()) {
  235. System.out.println("失败的行:" + batchGetRowRequest.getPrimaryKey(rowResult.getTableName(), rowResult.getIndex()));
  236. System.out.println("失败原因:" + rowResult.getError());
  237. }
  238.  
  239. /**
  240. * 可以通过createRequestForRetry方法再构造一个请求对失败的行进行重试.这里只给出构造重试请求的部分.
  241. * 推荐的重试方法是使用SDK的自定义重试策略功能, 支持对batch操作的部分行错误进行重试. 设定重试策略后, 调用接口处即不需要增加重试代码.
  242. */
  243. BatchGetRowRequest retryRequest = batchGetRowRequest.createRequestForRetry(batchGetRowResponse.getFailedRows());
  244. }
  245. }
  246.  
  247. }

demo1:

  1. import com.alicloud.openservices.tablestore.ClientException;
  2. import com.alicloud.openservices.tablestore.SyncClient;
  3. import com.alicloud.openservices.tablestore.TableStoreException;
  4. import com.alicloud.openservices.tablestore.model.*;
  5.  
  6. /**
  7. * Created by yizheng on 16/4/28.
  8. */
  9. public class TableOperationSample {
  10.  
  11. /**
  12. * 本示例中建立一张表,名为sampleTable,只含有一个主键, 主键名为pk.
  13. */
  14. private static final String TABLE_NAME = "sampleTable2";
  15. private static final String PRIMARY_KEY_NAME = "pk";
  16.  
  17. public static void main(String[] args) {
  18. final String endPoint = "";
  19. final String accessId = "";
  20. final String accessKey = "";
  21. final String instanceName = "";
  22.  
  23. SyncClient client = new SyncClient(endPoint, accessId, accessKey,
  24. instanceName);
  25.  
  26. try {
  27. // 创建表
  28. createTable(client);
  29.  
  30. // list table查看表的列表
  31. listTable(client);
  32.  
  33. // 查看表的属性
  34. describeTable(client);
  35.  
  36. // 更新表的属性
  37. updateTable(client);
  38.  
  39. // update table完之后查看表的属性
  40. describeTable(client);
  41.  
  42. // list table查看表的列表
  43. listTable(client);
  44. } catch (TableStoreException e) {
  45. System.err.println("操作失败,详情:" + e.getMessage());
  46. System.err.println("Request ID:" + e.getRequestId());
  47. } catch (ClientException e) {
  48. System.err.println("请求失败,详情:" + e.getMessage());
  49. }
  50. client.shutdown();
  51. }
  52.  
  53. public static void createTable(SyncClient client) {
  54. TableMeta tableMeta = new TableMeta(TABLE_NAME);
  55. tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME, PrimaryKeyType.STRING));
  56.  
  57. int timeToLive = -1; // 数据的过期时间, 单位秒, -1代表永不过期. 假如设置过期时间为一年, 即为 365 * 24 * 3600.
  58. int maxVersions = 3; // 保存的最大版本数, 设置为3即代表每列上最多保存3个最新的版本.
  59.  
  60. TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
  61.  
  62. CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
  63.  
  64. client.createTable(request);
  65. }
  66.  
  67. public static void updateTable(SyncClient client) {
  68. int timeToLive = -1;
  69. int maxVersions = 5; //更新最大版本数为5.
  70.  
  71. TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
  72.  
  73. UpdateTableRequest request = new UpdateTableRequest(TABLE_NAME);
  74. request.setTableOptionsForUpdate(tableOptions);
  75.  
  76. client.updateTable(request);
  77. }
  78.  
  79. public static void describeTable(SyncClient client) {
  80. DescribeTableRequest request = new DescribeTableRequest(TABLE_NAME);
  81. DescribeTableResponse response = client.describeTable(request);
  82.  
  83. TableMeta tableMeta = response.getTableMeta();
  84. System.out.println("表的名称:" + tableMeta.getTableName());
  85. System.out.println("表的主键:");
  86. for (PrimaryKeySchema primaryKeySchema : tableMeta.getPrimaryKeyList()) {
  87. System.out.println(primaryKeySchema);
  88. }
  89. TableOptions tableOptions = response.getTableOptions();
  90. System.out.println("表的TTL:" + tableOptions.getTimeToLive());
  91. System.out.println("表的MaxVersions:" + tableOptions.getMaxVersions());
  92. ReservedThroughputDetails reservedThroughputDetails = response.getReservedThroughputDetails();
  93. System.out.println("表的预留读吞吐量:"
  94. + reservedThroughputDetails.getCapacityUnit().getReadCapacityUnit());
  95. System.out.println("表的预留写吞吐量:"
  96. + reservedThroughputDetails.getCapacityUnit().getWriteCapacityUnit());
  97. }
  98.  
  99. public static void deleteTable(SyncClient client) {
  100. DeleteTableRequest request = new DeleteTableRequest(TABLE_NAME);
  101. client.deleteTable(request);
  102. }
  103.  
  104. public static void listTable(SyncClient client) {
  105. ListTableResponse response = client.listTable();
  106. System.out.println("表的列表如下:");
  107. for (String tableName : response.getTableNames()) {
  108. System.out.println(tableName);
  109. }
  110. }
  111. }

demo2

  1. import com.alicloud.openservices.tablestore.ClientException;
  2. import com.alicloud.openservices.tablestore.SyncClient;
  3. import com.alicloud.openservices.tablestore.TableStoreException;
  4. import com.alicloud.openservices.tablestore.model.*;
  5. import com.alicloud.openservices.tablestore.model.condition.ColumnCondition;
  6. import com.alicloud.openservices.tablestore.model.condition.SingleColumnValueCondition;
  7. import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueFilter;
  8.  
  9. import java.util.Iterator;
  10.  
  11. public class PkAutoIncrSample {
  12.  
  13. /**
  14. * 本示例中建立一张表,名为sampleTable,两个主键, 主键分别为pk1,pk2.
  15. */
  16. private static final String TABLE_NAME = "sampleTable_pk";
  17. private static final String PRIMARY_KEY_NAME_1 = "pk1";
  18. private static final String PRIMARY_KEY_NAME_2 = "pk2";
  19.  
  20. public static void main(String[] args) {
  21. final String endPoint = "";
  22. final String accessId = "";
  23. final String accessKey = "";
  24. final String instanceName = "";
  25.  
  26. SyncClient client = new SyncClient(endPoint, accessId, accessKey,
  27. instanceName);
  28.  
  29. try {
  30. // 建表
  31. createTable(client);
  32.  
  33. System.out.println("create table succeeded.");
  34.  
  35. // 等待表load完毕.
  36. try {
  37. Thread.sleep(10 * 1000);
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41.  
  42. // putRow
  43. PrimaryKey pk = putRow(client);
  44.  
  45. System.out.println("put row succeeded,pk:" + pk.toString());
  46.  
  47. // getRow
  48. getRow(client, pk);
  49.  
  50. // updateRow
  51. updateRow(client, pk);
  52.  
  53. getRowWithFilter(client, pk);
  54.  
  55. // 使用condition递增一列
  56. updateRowWithCondition(client, pk);
  57.  
  58. // getRow
  59. getRow(client, pk);
  60.  
  61. // 再写入两行
  62. putRow(client);
  63. putRow(client);
  64.  
  65. // getRange
  66. getRange(client, "a", "z");
  67.  
  68. // 使用iterator进行getRange
  69. getRangeByIterator(client, "a", "z");
  70.  
  71. batchWriteRow(client);
  72.  
  73. } catch (TableStoreException e) {
  74. System.err.println("操作失败,详情:" + e.getMessage());
  75. System.err.println("Request ID:" + e.getRequestId());
  76. } catch (ClientException e) {
  77. System.err.println("请求失败,详情:" + e.getMessage());
  78. } finally {
  79. // 为了安全,这里不能默认删表,如果需要删表,需用户自己手动打开
  80. // deleteTable(client);
  81. }
  82. client.shutdown();
  83. }
  84.  
  85. private static void createTable(SyncClient client) {
  86. TableMeta tableMeta = new TableMeta(TABLE_NAME);
  87. tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_1, PrimaryKeyType.STRING));
  88. tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_2, PrimaryKeyType.INTEGER, PrimaryKeyOption.AUTO_INCREMENT));
  89.  
  90. int timeToLive = -1; // 数据的过期时间, 单位秒, -1代表永不过期. 假如设置过期时间为一年, 即为 365 * 24 * 3600.
  91. int maxVersions = 1; // 保存的最大版本数, 设置为1即代表每列上最多保存一个版本(保存最新的版本).
  92.  
  93. TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
  94.  
  95. CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
  96.  
  97. client.createTable(request);
  98. }
  99.  
  100. private static void deleteTable(SyncClient client) {
  101. DeleteTableRequest request = new DeleteTableRequest(TABLE_NAME);
  102. client.deleteTable(request);
  103. }
  104.  
  105. private static PrimaryKey putRow(SyncClient client) {
  106. // 构造主键
  107. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  108. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromString("chengdu"));
  109. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.AUTO_INCRMENT);
  110. PrimaryKey primaryKey = primaryKeyBuilder.build();
  111.  
  112. RowPutChange rowPutChange = new RowPutChange(TABLE_NAME, primaryKey);
  113. rowPutChange.setReturnType(ReturnType.RT_PK);
  114.  
  115. //加入一些属性列
  116. long ts = System.currentTimeMillis();
  117. for (int i = 0; i < 10; i++) {
  118. for (int j = 0; j < 3; j++) {
  119. rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
  120. }
  121. }
  122.  
  123. PutRowResponse response = client.putRow(new PutRowRequest(rowPutChange));
  124. // 打印出消耗的CU
  125. CapacityUnit cu = response.getConsumedCapacity().getCapacityUnit();
  126. System.out.println("Read CapacityUnit:" + cu.getReadCapacityUnit());
  127. System.out.println("Write CapacityUnit:" + cu.getWriteCapacityUnit());
  128.  
  129. // 打印出返回的PK列
  130. PrimaryKey pk = response.getRow().getPrimaryKey();
  131. System.out.println("PrimaryKey:" + pk.toString());
  132.  
  133. return pk;
  134. }
  135.  
  136. private static void updateRow(SyncClient client, PrimaryKey pk) {
  137. RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, pk);
  138.  
  139. // 更新一些列
  140. for (int i = 0; i < 10; i++) {
  141. rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
  142. }
  143.  
  144. // 删除某列的某一版本
  145. rowUpdateChange.deleteColumn("Col10", 1465373223000L);
  146.  
  147. // 删除某一列
  148. rowUpdateChange.deleteColumns("Col11");
  149. rowUpdateChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_EXIST));
  150.  
  151. client.updateRow(new UpdateRowRequest(rowUpdateChange));
  152. }
  153.  
  154. private static void deleteRow(SyncClient client, PrimaryKey pk) {
  155. RowDeleteChange rowDeleteChange = new RowDeleteChange(TABLE_NAME, pk);
  156.  
  157. client.deleteRow(new DeleteRowRequest(rowDeleteChange));
  158. }
  159.  
  160. private static void batchWriteRow(SyncClient client) {
  161. BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
  162.  
  163. // 构造rowPutChange1
  164. PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  165. pk1Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromString("Hangzhou"));
  166. pk1Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.AUTO_INCRMENT);
  167. RowPutChange rowPutChange1 = new RowPutChange(TABLE_NAME, pk1Builder.build());
  168. rowPutChange1.setReturnType(ReturnType.RT_PK);
  169. // 添加一些列
  170. rowPutChange1.addColumn(new Column("Column_0", ColumnValue.fromLong(99)));
  171.  
  172. // 添加到batch操作中
  173. batchWriteRowRequest.addRowChange(rowPutChange1);
  174.  
  175. // 构造rowPutChange2
  176. PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  177. pk2Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromString("Hangzhou"));
  178. pk2Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.AUTO_INCRMENT);
  179. RowPutChange rowPutChange2 = new RowPutChange(TABLE_NAME, pk2Builder.build());
  180. rowPutChange2.setReturnType(ReturnType.RT_PK);
  181. // 添加一些列
  182. rowPutChange2.addColumn(new Column("Column_0", ColumnValue.fromLong(100)));
  183.  
  184. // 添加到batch操作中
  185. batchWriteRowRequest.addRowChange(rowPutChange2);
  186.  
  187. // 构造rowUpdateChange
  188. PrimaryKeyBuilder pk3Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  189. pk3Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromString("Hangzhou"));
  190. pk3Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.AUTO_INCRMENT);
  191.  
  192. RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, pk3Builder.build());
  193. rowUpdateChange.setReturnType(ReturnType.RT_PK);
  194. // 添加一列
  195. rowUpdateChange.put(new Column("Column_0", ColumnValue.fromLong(101)));
  196.  
  197. // 删除一列
  198. rowUpdateChange.deleteColumns("Column_1");
  199. // 添加到batch操作中
  200. batchWriteRowRequest.addRowChange(rowUpdateChange);
  201.  
  202. // 构造rowDeleteChange
  203. PrimaryKeyBuilder pk4Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  204. pk4Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromString("Hangzhou"));
  205. pk4Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromLong(1));
  206. RowDeleteChange rowDeleteChange = new RowDeleteChange(TABLE_NAME, pk4Builder.build());
  207. rowDeleteChange.setReturnType(ReturnType.RT_PK);
  208. // 添加到batch操作中
  209. batchWriteRowRequest.addRowChange(rowDeleteChange);
  210.  
  211. BatchWriteRowResponse response = client.batchWriteRow(batchWriteRowRequest);
  212.  
  213. System.out.println("是否全部成功:" + response.isAllSucceed());
  214. if (!response.isAllSucceed()) {
  215. for (BatchWriteRowResponse.RowResult rowResult : response.getFailedRows()) {
  216. System.out.println("失败的行:" + batchWriteRowRequest.getRowChange(rowResult.getTableName(), rowResult.getIndex()).getPrimaryKey());
  217. System.out.println("失败原因:" + rowResult.getError());
  218. }
  219. /*
  220. * 可以通过createRequestForRetry方法再构造一个请求对失败的行进行重试.这里只给出构造重试请求的部分.
  221. * 推荐的重试方法是使用SDK的自定义重试策略功能, 支持对batch操作的部分行错误进行重试. 设定重试策略后, 调用接口处即不需要增加重试代码.
  222. */
  223. BatchWriteRowRequest retryRequest = batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
  224. } else {
  225. for (BatchWriteRowResponse.RowResult rowResult : response.getSucceedRows()) {
  226. PrimaryKey pk = rowResult.getRow().getPrimaryKey();
  227. System.out.println("Return PK:" + pk.jsonize());
  228. }
  229. }
  230. }
  231.  
  232. private static void getRow(SyncClient client, PrimaryKey pk) {
  233. // 读一行
  234. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, pk);
  235. // 设置读取最新版本
  236. criteria.setMaxVersions(1);
  237. GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
  238. Row row = getRowResponse.getRow();
  239.  
  240. System.out.println("读取完毕, 结果为: ");
  241. System.out.println(row);
  242.  
  243. // 设置读取某些列
  244. criteria.addColumnsToGet("Col0");
  245. getRowResponse = client.getRow(new GetRowRequest(criteria));
  246. row = getRowResponse.getRow();
  247.  
  248. System.out.println("读取完毕, 结果为: ");
  249. System.out.println(row);
  250. }
  251.  
  252. private static void getRowWithFilter(SyncClient client, PrimaryKey pk) {
  253. // 读一行
  254. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, pk);
  255. // 设置读取最新版本
  256. criteria.setMaxVersions(1);
  257.  
  258. // 设置过滤器, 当Col0的值为0时返回该行.
  259. SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
  260. SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
  261. // 如果不存在Col0这一列, 也不返回.
  262. singleColumnValueFilter.setPassIfMissing(false);
  263. // 只判断最新版本
  264. singleColumnValueFilter.setLatestVersionsOnly(true);
  265.  
  266. criteria.setFilter(singleColumnValueFilter);
  267.  
  268. GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
  269. Row row = getRowResponse.getRow();
  270.  
  271. System.out.println("读取完毕, 结果为: ");
  272. System.out.println(row);
  273. }
  274.  
  275. // 通过Condition实现乐观锁机制, 递增一列.
  276. private static void updateRowWithCondition(SyncClient client, PrimaryKey pk) {
  277. // 读一行
  278. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, pk);
  279. criteria.setMaxVersions(1);
  280. GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
  281. Row row = getRowResponse.getRow();
  282. long col0Value = row.getLatestColumn("Col0").getValue().asLong();
  283.  
  284. // 条件更新Col0这一列, 使列值+1
  285. RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, pk);
  286. Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
  287. ColumnCondition columnCondition = new SingleColumnValueCondition("Col0", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(col0Value));
  288. condition.setColumnCondition(columnCondition);
  289. rowUpdateChange.setCondition(condition);
  290. rowUpdateChange.put(new Column("Col0", ColumnValue.fromLong(col0Value + 1)));
  291.  
  292. try {
  293. client.updateRow(new UpdateRowRequest(rowUpdateChange));
  294. } catch (TableStoreException ex) {
  295. System.out.println(ex.toString());
  296. }
  297. }
  298.  
  299. private static void getRange(SyncClient client, String startPkValue, String endPkValue) {
  300. RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(TABLE_NAME);
  301.  
  302. // 设置起始主键
  303. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  304. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromString(startPkValue));
  305. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromLong(0));
  306. rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
  307.  
  308. // 设置结束主键
  309. primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  310. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromString(endPkValue));
  311. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
  312. rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
  313.  
  314. rangeRowQueryCriteria.setMaxVersions(1);
  315.  
  316. System.out.println("GetRange的结果为:");
  317. while (true) {
  318. GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
  319. for (Row row : getRangeResponse.getRows()) {
  320. System.out.println(row);
  321. }
  322.  
  323. // 若nextStartPrimaryKey不为null, 则继续读取.
  324. if (getRangeResponse.getNextStartPrimaryKey() != null) {
  325. rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
  326. } else {
  327. break;
  328. }
  329. }
  330. }
  331.  
  332. private static void getRangeByIterator(SyncClient client, String startPkValue, String endPkValue) {
  333. RangeIteratorParameter rangeIteratorParameter = new RangeIteratorParameter(TABLE_NAME);
  334.  
  335. // 设置起始主键
  336. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  337. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromString(startPkValue));
  338. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromLong(0));
  339. rangeIteratorParameter.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
  340.  
  341. // 设置结束主键
  342. primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  343. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromString(endPkValue));
  344. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
  345. rangeIteratorParameter.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
  346.  
  347. rangeIteratorParameter.setMaxVersions(1);
  348.  
  349. Iterator<Row> iterator = client.createRangeIterator(rangeIteratorParameter);
  350.  
  351. System.out.println("使用Iterator进行GetRange的结果为:");
  352. while (iterator.hasNext()) {
  353. Row row = iterator.next();
  354. System.out.println(row);
  355. }
  356. }
  357.  
  358. }

demo3

  1. import com.alicloud.openservices.tablestore.ClientException;
  2. import com.alicloud.openservices.tablestore.SyncClient;
  3. import com.alicloud.openservices.tablestore.TableStoreException;
  4. import com.alicloud.openservices.tablestore.model.*;
  5. import com.alicloud.openservices.tablestore.model.condition.ColumnCondition;
  6. import com.alicloud.openservices.tablestore.model.condition.SingleColumnValueCondition;
  7. import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueFilter;
  8.  
  9. import java.util.Iterator;
  10.  
  11. public class DataOperationSample {
  12.  
  13. /**
  14. * 本示例中建立一张表,名为sampleTable,只含有一个主键, 主键名为pk.
  15. */
  16. private static final String TABLE_NAME = "sampleTable";
  17. private static final String PRIMARY_KEY_NAME = "pk";
  18.  
  19. public static void main(String[] args) {
  20. final String endPoint = "";
  21. final String accessId = "";
  22. final String accessKey = "";
  23. final String instanceName = "";
  24.  
  25. SyncClient client = new SyncClient(endPoint, accessId, accessKey, instanceName);
  26.  
  27. try {
  28. // 建表
  29. createTable(client);
  30.  
  31. // 等待表load完毕.
  32. try {
  33. Thread.sleep(10 * 1000);
  34. } catch (InterruptedException e) {
  35. e.printStackTrace();
  36. }
  37.  
  38. // putRow
  39. putRow(client, "pkValue");
  40.  
  41. // getRow
  42. getRow(client, "pkValue");
  43.  
  44. // updateRow
  45. updateRow(client, "pkValue");
  46.  
  47. // 使用condition递增一列
  48. updateRowWithCondition(client, "pkValue");
  49.  
  50. // getRow
  51. getRow(client, "pkValue");
  52.  
  53. // 再写入两行
  54. putRow(client, "aaa");
  55. putRow(client, "bbb");
  56.  
  57. // getRange
  58. getRange(client, "a", "z");
  59.  
  60. // 使用iterator进行getRange
  61. getRangeByIterator(client, "a", "z");
  62.  
  63. batchWriteRow(client);
  64.  
  65. batchGetRow(client);
  66.  
  67. } catch (TableStoreException e) {
  68. System.err.println("操作失败,详情:" + e.getMessage());
  69. System.err.println("Request ID:" + e.getRequestId());
  70. } catch (ClientException e) {
  71. System.err.println("请求失败,详情:" + e.getMessage());
  72. } finally {
  73. // 为了安全,这里不能默认删表,如果需要删表,需用户自己手动打开
  74. // deleteTable(client);
  75. }
  76. client.shutdown();
  77. }
  78.  
  79. private static void createTable(SyncClient client) {
  80. TableMeta tableMeta = new TableMeta(TABLE_NAME);
  81. tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME, PrimaryKeyType.STRING));
  82.  
  83. int timeToLive = -1; // 数据的过期时间, 单位秒, -1代表永不过期. 假如设置过期时间为一年, 即为 365 * 24 * 3600.
  84. int maxVersions = 1; // 保存的最大版本数, 设置为1即代表每列上最多保存一个版本(保存最新的版本).
  85.  
  86. TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
  87.  
  88. CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
  89.  
  90. client.createTable(request);
  91. }
  92.  
  93. private static void deleteTable(SyncClient client) {
  94. DeleteTableRequest request = new DeleteTableRequest(TABLE_NAME);
  95. client.deleteTable(request);
  96. }
  97.  
  98. private static void putRow(SyncClient client, String pkValue) {
  99. // 构造主键
  100. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  101. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
  102. PrimaryKey primaryKey = primaryKeyBuilder.build();
  103.  
  104. RowPutChange rowPutChange = new RowPutChange(TABLE_NAME, primaryKey);
  105.  
  106. //加入一些属性列
  107. long ts = System.currentTimeMillis();
  108. for (int i = 0; i < 10; i++) {
  109. for (int j = 0; j < 3; j++) {
  110. rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
  111. }
  112. }
  113.  
  114. client.putRow(new PutRowRequest(rowPutChange));
  115. }
  116.  
  117. private static void updateRow(SyncClient client, String pkValue) {
  118. // 构造主键
  119. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  120. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
  121. PrimaryKey primaryKey = primaryKeyBuilder.build();
  122.  
  123. RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, primaryKey);
  124.  
  125. // 更新一些列
  126. for (int i = 0; i < 10; i++) {
  127. rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
  128. }
  129.  
  130. // 删除某列的某一版本
  131. rowUpdateChange.deleteColumn("Col10", 1465373223000L);
  132.  
  133. // 删除某一列
  134. rowUpdateChange.deleteColumns("Col11");
  135.  
  136. client.updateRow(new UpdateRowRequest(rowUpdateChange));
  137. }
  138.  
  139. private static void deleteRow(SyncClient client, String pkValue) {
  140. // 构造主键
  141. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  142. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
  143. PrimaryKey primaryKey = primaryKeyBuilder.build();
  144.  
  145. RowDeleteChange rowDeleteChange = new RowDeleteChange(TABLE_NAME, primaryKey);
  146.  
  147. client.deleteRow(new DeleteRowRequest(rowDeleteChange));
  148. }
  149.  
  150. public static void batchWriteRow(SyncClient client) {
  151. BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
  152.  
  153. // 构造rowPutChange1
  154. PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  155. pk1Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk1"));
  156. RowPutChange rowPutChange1 = new RowPutChange(TABLE_NAME, pk1Builder.build());
  157. // 添加一些列
  158. for (int i = 0; i < 10; i++) {
  159. rowPutChange1.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
  160. }
  161. // 添加到batch操作中
  162. batchWriteRowRequest.addRowChange(rowPutChange1);
  163.  
  164. // 构造rowPutChange2
  165. PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  166. pk2Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk2"));
  167. RowPutChange rowPutChange2 = new RowPutChange(TABLE_NAME, pk2Builder.build());
  168. // 添加一些列
  169. for (int i = 0; i < 10; i++) {
  170. rowPutChange2.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
  171. }
  172. // 添加到batch操作中
  173. batchWriteRowRequest.addRowChange(rowPutChange2);
  174.  
  175. // 构造rowUpdateChange
  176. PrimaryKeyBuilder pk3Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  177. pk3Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk3"));
  178. RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, pk3Builder.build());
  179. // 添加一些列
  180. for (int i = 0; i < 10; i++) {
  181. rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
  182. }
  183. // 删除一列
  184. rowUpdateChange.deleteColumns("Col10");
  185. // 添加到batch操作中
  186. batchWriteRowRequest.addRowChange(rowUpdateChange);
  187.  
  188. // 构造rowDeleteChange
  189. PrimaryKeyBuilder pk4Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  190. pk4Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk4"));
  191. RowDeleteChange rowDeleteChange = new RowDeleteChange(TABLE_NAME, pk4Builder.build());
  192. // 添加到batch操作中
  193. batchWriteRowRequest.addRowChange(rowDeleteChange);
  194.  
  195. BatchWriteRowResponse response = client.batchWriteRow(batchWriteRowRequest);
  196.  
  197. System.out.println("是否全部成功:" + response.isAllSucceed());
  198. if (!response.isAllSucceed()) {
  199. for (BatchWriteRowResponse.RowResult rowResult : response.getFailedRows()) {
  200. System.out.println("失败的行:" + batchWriteRowRequest.getRowChange(rowResult.getTableName(), rowResult.getIndex()).getPrimaryKey());
  201. System.out.println("失败原因:" + rowResult.getError());
  202. }
  203. /**
  204. * 可以通过createRequestForRetry方法再构造一个请求对失败的行进行重试.这里只给出构造重试请求的部分.
  205. * 推荐的重试方法是使用SDK的自定义重试策略功能, 支持对batch操作的部分行错误进行重试. 设定重试策略后, 调用接口处即不需要增加重试代码.
  206. */
  207. BatchWriteRowRequest retryRequest = batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
  208. }
  209. }
  210.  
  211. private static void getRow(SyncClient client, String pkValue) {
  212. // 构造主键
  213. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  214. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
  215. PrimaryKey primaryKey = primaryKeyBuilder.build();
  216.  
  217. // 读一行
  218. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
  219. // 设置读取最新版本
  220. criteria.setMaxVersions(1);
  221. GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
  222. Row row = getRowResponse.getRow();
  223.  
  224. System.out.println("读取完毕, 结果为: ");
  225. System.out.println(row);
  226.  
  227. // 设置读取某些列
  228. criteria.addColumnsToGet("Col0");
  229. getRowResponse = client.getRow(new GetRowRequest(criteria));
  230. row = getRowResponse.getRow();
  231.  
  232. System.out.println("读取完毕, 结果为: ");
  233. System.out.println(row);
  234. }
  235.  
  236. private static void getRowWithFilter(SyncClient client, String pkValue) {
  237. // 构造主键
  238. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  239. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
  240. PrimaryKey primaryKey = primaryKeyBuilder.build();
  241.  
  242. // 读一行
  243. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
  244. // 设置读取最新版本
  245. criteria.setMaxVersions(1);
  246.  
  247. // 设置过滤器, 当Col0的值为0时返回该行.
  248. SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
  249. SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
  250. // 如果不存在Col0这一列, 也不返回.
  251. singleColumnValueFilter.setPassIfMissing(false);
  252. // 只判断最新版本
  253. singleColumnValueFilter.setLatestVersionsOnly(true);
  254.  
  255. criteria.setFilter(singleColumnValueFilter);
  256.  
  257. GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
  258. Row row = getRowResponse.getRow();
  259.  
  260. System.out.println("读取完毕, 结果为: ");
  261. System.out.println(row);
  262. }
  263.  
  264. private static void batchGetRow(SyncClient client) {
  265. MultiRowQueryCriteria multiRowQueryCriteria = new MultiRowQueryCriteria(TABLE_NAME);
  266. // 加入10个要读取的行
  267. for (int i = 0; i < 10; i++) {
  268. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  269. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk" + i));
  270. PrimaryKey primaryKey = primaryKeyBuilder.build();
  271. multiRowQueryCriteria.addRow(primaryKey);
  272. }
  273. // 添加条件
  274. multiRowQueryCriteria.setMaxVersions(1);
  275. multiRowQueryCriteria.addColumnsToGet("Col0");
  276. multiRowQueryCriteria.addColumnsToGet("Col1");
  277. SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
  278. SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
  279. singleColumnValueFilter.setPassIfMissing(false);
  280. multiRowQueryCriteria.setFilter(singleColumnValueFilter);
  281.  
  282. BatchGetRowRequest batchGetRowRequest = new BatchGetRowRequest();
  283. // batchGetRow支持读取多个表的数据, 一个multiRowQueryCriteria对应一个表的查询条件, 可以添加多个multiRowQueryCriteria.
  284. batchGetRowRequest.addMultiRowQueryCriteria(multiRowQueryCriteria);
  285.  
  286. BatchGetRowResponse batchGetRowResponse = client.batchGetRow(batchGetRowRequest);
  287.  
  288. System.out.println("是否全部成功:" + batchGetRowResponse.isAllSucceed());
  289. if (!batchGetRowResponse.isAllSucceed()) {
  290. for (BatchGetRowResponse.RowResult rowResult : batchGetRowResponse.getFailedRows()) {
  291. System.out.println("失败的行:" + batchGetRowRequest.getPrimaryKey(rowResult.getTableName(), rowResult.getIndex()));
  292. System.out.println("失败原因:" + rowResult.getError());
  293. }
  294.  
  295. /**
  296. * 可以通过createRequestForRetry方法再构造一个请求对失败的行进行重试.这里只给出构造重试请求的部分.
  297. * 推荐的重试方法是使用SDK的自定义重试策略功能, 支持对batch操作的部分行错误进行重试. 设定重试策略后, 调用接口处即不需要增加重试代码.
  298. */
  299. BatchGetRowRequest retryRequest = batchGetRowRequest.createRequestForRetry(batchGetRowResponse.getFailedRows());
  300. }
  301. }
  302.  
  303. // 通过Condition实现乐观锁机制, 递增一列.
  304. private static void updateRowWithCondition(SyncClient client, String pkValue) {
  305. // 构造主键
  306. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  307. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
  308. PrimaryKey primaryKey = primaryKeyBuilder.build();
  309.  
  310. // 读一行
  311. SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
  312. criteria.setMaxVersions(1);
  313. GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
  314. Row row = getRowResponse.getRow();
  315. long col0Value = row.getLatestColumn("Col0").getValue().asLong();
  316.  
  317. // 条件更新Col0这一列, 使列值+1
  318. RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, primaryKey);
  319. Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
  320. ColumnCondition columnCondition = new SingleColumnValueCondition("Col0", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(col0Value));
  321. condition.setColumnCondition(columnCondition);
  322. rowUpdateChange.setCondition(condition);
  323. rowUpdateChange.put(new Column("Col0", ColumnValue.fromLong(col0Value + 1)));
  324.  
  325. try {
  326. client.updateRow(new UpdateRowRequest(rowUpdateChange));
  327. } catch (TableStoreException ex) {
  328. System.out.println(ex.toString());
  329. }
  330. }
  331.  
  332. private static void getRange(SyncClient client, String startPkValue, String endPkValue) {
  333. RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(TABLE_NAME);
  334.  
  335. // 设置起始主键
  336. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  337. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(startPkValue));
  338. rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
  339.  
  340. // 设置结束主键
  341. primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  342. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(endPkValue));
  343. rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
  344.  
  345. rangeRowQueryCriteria.setMaxVersions(1);
  346.  
  347. System.out.println("GetRange的结果为:");
  348. while (true) {
  349. GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
  350. for (Row row : getRangeResponse.getRows()) {
  351. System.out.println(row);
  352. }
  353.  
  354. // 若nextStartPrimaryKey不为null, 则继续读取.
  355. if (getRangeResponse.getNextStartPrimaryKey() != null) {
  356. rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
  357. } else {
  358. break;
  359. }
  360. }
  361. }
  362.  
  363. private static void getRangeByIterator(SyncClient client, String startPkValue, String endPkValue) {
  364. RangeIteratorParameter rangeIteratorParameter = new RangeIteratorParameter(TABLE_NAME);
  365.  
  366. // 设置起始主键
  367. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  368. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(startPkValue));
  369. rangeIteratorParameter.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
  370.  
  371. // 设置结束主键
  372. primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  373. primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(endPkValue));
  374. rangeIteratorParameter.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
  375.  
  376. rangeIteratorParameter.setMaxVersions(1);
  377.  
  378. Iterator<Row> iterator = client.createRangeIterator(rangeIteratorParameter);
  379.  
  380. System.out.println("使用Iterator进行GetRange的结果为:");
  381. while (iterator.hasNext()) {
  382. Row row = iterator.next();
  383. System.out.println(row);
  384. }
  385. }
  386.  
  387. }

aliyun TableStore相关操作汇总的更多相关文章

  1. Object-C中动态类型对象相关操作汇总

    Object-C(以后简称OC)中有id类型,相对于明确定义类型的静态类型,称为动态类型. 使用动态类型,配合多态(不同类型拥有同名方法),动态绑定(运行时决定实际调用的方法)可以将很多判断延迟到运行 ...

  2. Git相关操作汇总

    git clone: 正如上图,当我们打开终端的情况下,默认我们所在的目录是在/home/shiyanlou的,大家可以在终端输入以下命令把目录切换到桌面cd  /home/Desktop这个时候输入 ...

  3. executeBatch()相关操作汇总

    环境:oracle使用PreparedStatement的executeBatch方法,如果DML操作成功,返回值[-2,-2,...]an array of update counts contai ...

  4. Java 常用知识点汇总(数据类型之间转换、字符串的相关操作-截取、转换大小写等)

    1.Java四类八种数据类型 byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围- ...

  5. [转帖]xserver相关知识汇总

    xserver相关知识汇总 https://blog.csdn.net/QTVLC/article/details/81739984   本文主要是从以下几个方面介绍xorg-xserver 相关的知 ...

  6. Spark 1.x 爆内存相关问题汇总及解

    Spark 1.x 爆内存相关问题汇总及解决 OOM # 包括GC Overhead limitjava.lang.OutOfMemoryError # on yarn org.apache.hado ...

  7. yum安装_yum命令的相关操作

    2017年1月11日, 星期三 yum安装的四种方式 一.默认:从国外下载 二.国内:从阿里获取  http://mirrors.aliyun.com 1. cd /etc/yum.repos.d 2 ...

  8. solidity的delete操作汇总

    简介 Solidity中的特殊操作符delete用于释放空间,为鼓励主动对空间的回收,释放空间将会返还一些gas. delete操作符可以用于任何变量,将其设置成默认值0. 删除枚举类型时,会将其值重 ...

  9. 从零自学Hadoop(20):HBase数据模型相关操作上

    阅读目录 序 介绍 命名空间 表 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...

随机推荐

  1. SpriteBuilder中如何简单的重置APP保存的数据

    在任意一款APP中,我们可能需要在磁盘上保存一些游戏数据,以便在下一次运行APP时恢复游戏数据. 但是由于在测试阶段,我们需要快速恢复初始状态的游戏数据,该如何做呢? 非常简单,只需要将APP从真机或 ...

  2. ERP-非财务人员的财务培训教(四)------公司/部门的成本与费用控制

    一.损益表.资产负责表 二.成本分类 ----成本习性 三.成本核算模式 四.成本控制原则 第四部分 公司/部门的成本与费用控制   一.损益表.资产负责表   项目 Items 产品销售收入 Sal ...

  3. Linux本地网络脚本配置(内网与外网)

    脚本位于:     /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 //网卡的名字 BOOTPROTO=static // none静态IP ...

  4. 网站开发进阶(八)tomcat异常日志分析及处理

    tomcat异常日志分析及处理 日志信息如下: 2015-10-29 18:39:49 org.apache.coyote.http11.Http11Protocol pause 信息: Pausin ...

  5. VS2010 / MFC + OpenCV 2.4.9打开图片

    原文地址:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=30832 第一部分,参考http://jingyan.baidu.com ...

  6. IOS动画(Core Animation)总结 (参考多方文章)

    一.简介 iOS 动画主要是指Core Animation框架.官方使用文档地址为:Core Animation Guide. Core Animation是IOS和OS X平台上负责图形渲染与动画的 ...

  7. Android高效率编码-细节,控件,架包,功能,工具,开源汇总,你想要的这里都有

    Android高效率编码-细节,控件,架包,功能,工具,开源汇总 其实写博客的初衷也并不是说什么分享技术,毕竟咱还只是个小程序员,最大的目的就是对自我的知识积累,以后万一编码的时候断片了,也可以翻出来 ...

  8. 关于GPL329A添加摄像头驱动需要更改的配置脚本

    我今天要添加一个ov2685的驱动进Digogo这部机子,当然要让它开机自动启动,就要想办法让它的.ko在启动文件系统的时候要自动被装载,这样上层打开摄像头才能加载摄像头驱动. 我找到源码工程对应添加 ...

  9. 关于UIView中相关坐标及改变的相关方法

    // 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UI ...

  10. MySQL 菜鸟入门“秘籍”

    一.MySQL简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不 ...