全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
表格存储

多行数据操作

更新时间:2018-03-08 20:37:51

Table Store提供了BatchGetRow,BatchWriteRow和GetRange等多行操作的接口。

说明:以下操作为同步接口的示例,异步接口的操作请参见异步接口

批量读(BatchGetRow)

批量读取一个或多个表中的若干行数据。

BatchGetRow操作可视为多个GetRow操作的集合,各个操作独立执行,独立返回结果,独立计算服务能力单元。与执行大量的GetRow操作相比,使用BatchGetRow操作可以有效减少请求的响应时间,提高数据的读取速率。

BatchGetRow可能出现以下两种错误:

  • 请求整体错误,比如网络错误。这类错误存放在batchGetRow()的返回值里。
  • 请求整体没有错误,但个别行出错。这类错误存放在相应的行的结果里。

示例

  1. BatchGetRowRequest req;
  2. {
  3. MultiPointQueryCriterion& criterion = req.mutableCriteria().append();
  4. IVector<MultiPointQueryCriterion::RowKey>& rowkeys = criterion.mutableRowKeys();
  5. {
  6. MultiPointQueryCriterion::RowKey& exist = rowkeys.append();
  7. exist.mutableGet().append() = PrimaryKeyColumn(
  8. "pkey",
  9. PrimaryKeyValue::toStr("some key"));
  10. exist.mutableUserData() = &userDataForSomeKey;
  11. }
  12. {
  13. MultiPointQueryCriterion::RowKey& exist = rowkeys.append();
  14. exist.mutableGet().append() = PrimaryKeyColumn(
  15. "pkey",
  16. PrimaryKeyValue::toStr("another key"));
  17. exist.mutableUserData() = &userDataForAnotherKey;
  18. }
  19. criterion.mutableTable() = "YourTable";
  20. criterion.mutableMaxVersions().reset(1);
  21. }
  22. BatchGetRowResponse resp;
  23. Optional<OTSError> res = client.batchGetRow(resp, req);

说明:详细代码可在batchGetRow@GitHub获取。

批量写(BatchWriteRow)

批量插入、修改或删除一个或多个表中的若干行数据。

BatchWriteRow操作可视为多个PutRow、UpdateRow、DeleteRow操作的集合,各个操作独立执行,独立返回结果,独立计算服务能力单元。

BatchWriteRow可能出现以下两种错误:

  • 请求整体的错误,比如网络超时。这类错误存放在batchWriteRow()返回值中。
  • 单行上的错误,比如主键值不合法。这类错误存放在BatchWriteRowResponse中的每一行上。

示例

  1. static const char kPutRow[] = "PutRow";
  2. static const char kUpdateRow[] = "UpdateRow";
  3. static const char kDeleteRow[] = "DeleteRow";
  4. BatchWriteRowRequest req;
  5. {
  6. // put row
  7. BatchWriteRowRequest::Put& put = req.mutablePuts().append();
  8. put.mutableUserData() = kPutRow;
  9. put.mutableGet().mutableTable() = kTableName;
  10. PrimaryKey& pkey = put.mutableGet().mutablePrimaryKey();
  11. pkey.append() = PrimaryKeyColumn(
  12. "pkey",
  13. PrimaryKeyValue::toStr("row to put"));
  14. }
  15. {
  16. // update row
  17. BatchWriteRowRequest::Update& update = req.mutableUpdates().append();
  18. update.mutableUserData() = kUpdateRow;
  19. update.mutableGet().mutableTable() = kTableName;
  20. PrimaryKey& pkey = update.mutableGet().mutablePrimaryKey();
  21. pkey.append() = PrimaryKeyColumn(
  22. "pkey",
  23. PrimaryKeyValue::toStr("row to update"));
  24. RowUpdateChange::Update& attr = update.mutableGet().mutableUpdates().append();
  25. attr.mutableType() = RowUpdateChange::Update::kPut;
  26. attr.mutableAttrName() = "attr0";
  27. attr.mutableAttrValue().reset(AttributeValue::toStr("some value"));
  28. }
  29. {
  30. // delete row
  31. BatchWriteRowRequest::Delete& del = req.mutableDeletes().append();
  32. del.mutableUserData() = kDeleteRow;
  33. del.mutableGet().mutableTable() = kTableName;
  34. PrimaryKey& pkey = del.mutableGet().mutablePrimaryKey();
  35. pkey.append() = PrimaryKeyColumn(
  36. "pkey",
  37. PrimaryKeyValue::toStr("row to delete"));
  38. }
  39. BatchWriteRowResponse resp;
  40. Optional<OTSError> res = client.batchWriteRow(resp, req);

说明:详细代码可在batchWriteRow@GitHub获取。

范围读(GetRange)

读取指定主键范围内的数据。

建议使用RangeIterator。构造RangeIterator需要提供:

  • 异步客户端

  • RangeQueryCriterion与单行读的PointQueryCriterion类似,但RangeQueryCriterion还需要:

    • 设定范围的起始点(包含)和终止点(不包含)。除了正常主键键值之外,还可以使用“负无穷大”(严格小于所有正常主键列值)和“正无穷大”(严格大于所有正常主键列值)两个特殊值。

    • 设定正序读取(由小及大)或者反序读取(由大及小)。默认为正序读取。正序读取时,起始点须小于终止点;反序读取时,起始点须大于终止点。

RangeIterator对象是个Iterator,提供三个接口:

  • moveNext()将RangeIterator对象移动到下一行。刚构造出来的RangeIterator对象必须调用moveNext()才可以取值。如果读取数据失败,moveNext()会将错误显示在返回值中。

  • valid()给出RangeIterator对象是否走到了范围的终点。

  • 如果valid()true,则可以通过get()读取到行对象。您可以将get()返回的行对象的内容搬移走以避免内存复制。如果移到他处,紧接着的get()将返回搬移后的内容。

示例

  1. RangeQueryCriterion query;
  2. query.mutableTable() = "YourTable";
  3. query.mutableMaxVersions().reset(1);
  4. {
  5. PrimaryKey& start = query.mutableInclusiveStart();
  6. start.append() = PrimaryKeyColumn(
  7. "pkey",
  8. PrimaryKeyValue::toInfMin());
  9. }
  10. {
  11. PrimaryKey& end = query.mutableExclusiveEnd();
  12. end.append() = PrimaryKeyColumn(
  13. "pkey",
  14. PrimaryKeyValue::toInfMax());
  15. }
  16. auto_ptr<AsyncClient> aclient(AsyncClient::create(client));
  17. RangeIterator iter(*aclient, query);
  18. for(;;) {
  19. Optional<OTSError> err = iter.moveNext();
  20. if (err.present()) {
  21. // do something with err
  22. abort();
  23. }
  24. if (!iter.valid()) {
  25. break;
  26. }
  27. Row& row = iter.get();
  28. // do something with row
  29. }

说明:详细代码可在GetRange@GitHub获取。

指定列读取

表格存储支持无限宽度的行,但一般无需读取整行,只需指定若干列读取即可。QueryCriterion(PointQueryCriterion、MultiPointQueryCriterion和RangeQueryCriterion的基类)提供了mutableColumnsToGet()方法来指定需要读取的列,既可以是属性列,也可以是主键列,如果为空则读取整行。

如果指定的列在读取的行上不存在,返回的结果里便缺失这个列。表格存储不提供占位符。

在范围读中,如果指定的列全部是属性列,而范围内某行恰好缺少全部指定的列,那么在结果中并不会出现这一行。如果确实需要感知到该行,可以将主键列加入到指定列之中。

指定版本读取

每个属性列可以包含多个版本,每个版本号(时间戳)对应一个列值。读取的时候可以指定读取多少个版本(mutableMaxVersions())以及读取的版本范围(mutableTimeRange())。

最大版本数和版本范围,至少指定其中一项:

  • 如果仅指定版本数,则返回所有版本里从新到旧至多指定数量个数据。
  • 如果仅指定版本范围,则返回该范围内所有数据。
  • 如果同时指定版本数和版本范围,则返回版本范围内从新到旧至多指定数量个数据。

条件写

条件写是指在写一行之前先检查条件,当条件成立才实际写入。表格存储保证条件检查和写入的原子性。

表格存储支持行存在性条件和列值条件:

  • 行存在性条件分为以下几种:

    • Ignore:忽略。默认值,无论行是否存在都写入。
    • ExpectExist:期望存在。行存在则写入。
    • ExpectNotExist:期望不存在。行不存在则写入。
  • 列值条件等同于过滤器

本文导读目录