閱讀1001 返回首頁    go 人物


多行數據操作__Java-SDK_SDK 參考_表格存儲-阿裏雲

表格存儲的 SDK 提供了 BatchGetRow、BatchWriteRow、GetRange 和 GetByIterator 等多行操作的接口。

批量讀(BatchGetRow)

批量讀取一個或多個表中的若幹行數據。

BatchGetRow 操作可視為多個 GetRow 操作的集合,各個操作獨立執行,獨立返回結果,獨立計算服務能力單元。

與執行大量的 GetRow 操作相比,使用 BatchGetRow 操作可以有效減少請求的響應時間,提高數據的讀取速率。

接口

  1. /**
  2. * 從多張表(Table)中獲取多行數據。
  3. *
  4. * @param batchGetRowRequest 執行BatchGetRow操作所需參數的封裝。
  5. * @return BatchGetRow操作的響應內容。
  6. * @throws OTSException OTS訪問返回錯誤消息
  7. * @throws ClientException 請求的返回結果無效, 或由於網絡原因請求失敗, 或訪問超時。
  8. */
  9. public BatchGetRowResult batchGetRow(BatchGetRowRequest batchGetRowRequest)
  10. throws OTSException, ClientException;

示例

批量一次讀 10 行。

  1. try
  2. {
  3. // 構造BatchGetRow對象和參數
  4. BatchGetRowRequest request = new BatchGetRowRequest();
  5. MultiRowQueryCriteria tableRows = new MultiRowQueryCriteria(tableName);
  6. for (int j = 0; j < 10; ++j) {
  7. RowPrimaryKey primaryKeys = new RowPrimaryKey();
  8. primaryKeys.addPrimaryKeyColumn("pk0", PrimaryKeyValue.fromLong(j));
  9. primaryKeys.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromLong(j)));
  10. tableRows.addRow(primaryKeys);
  11. }
  12. // 隻返回col0和col1列
  13. tableRows.addColumnsToGet(new String[] {"col0", "col1"});
  14. request.addMultiRowQueryCriteria(tableRows);
  15. // 調用batchGetRow接口
  16. BatchGetRowResult result = client.batchGetRow(request);
  17. // 統計是否有某些行執行失敗,如果有,則重試
  18. BatchGetRowRequest failedOperations = null;
  19. List<Row> succeedRows = new ArrayList<Row>();
  20. int retryCount = 0;
  21. do {
  22. failedOperations = new BatchGetRowRequest();
  23. Map<String, List<BatchGetRowResult.RowStatus>> status = result.getTableToRowsStatus();
  24. for (Entry<String, List<BatchGetRowResult.RowStatus>> entry : status.entrySet()) {
  25. tableName = entry.getKey();
  26. tableRows = new MultiRowQueryCriteria(tableName);
  27. List<BatchGetRowResult.RowStatus> statuses = entry.getValue();
  28. for (int index = 0; index < statuses.size(); index++) {
  29. BatchGetRowResult.RowStatus rowStatus = statuses.get(index);
  30. if (!rowStatus.isSucceed()) {
  31. // 操作失敗, 需要放到重試列表中再次重試
  32. // 需要重試的操作可以從request中獲取參數
  33. tableRows.addRow(request.getPrimaryKey(tableName, index));
  34. } else {
  35. succeedRows.add(rowStatus.getRow());
  36. System.out.println("Read row:");
  37. System.out.println("pk0:" + rowStatus.getRow().getColumns().get("pk0"));
  38. System.out.println("pk1:" + rowStatus.getRow().getColumns().get("pk1"));
  39. System.out.println("col0:" + rowStatus.getRow().getColumns().get("col0"));
  40. }
  41. }
  42. if (!tableRows.getRowKeys().isEmpty()) {
  43. tableRows.addColumnsToGet(new String[] {"col0", "col1"});
  44. failedOperations.addMultiRowQueryCriteria(tableRows);
  45. }
  46. }
  47. if (failedOperations.isEmpty() || ++retryCount > 3) {
  48. // 如果所有操作都成功了或者重試次數達到上線, 則不再需要重試。
  49. break;
  50. }
  51. // 如果有需要重試的操作, 則稍微等待一會後再次重試, 否則繼續出錯的概率很高。
  52. try {
  53. // 100ms後繼續重試
  54. Thread.sleep(100);
  55. } catch (InterruptedException e) {
  56. e.printStackTrace();
  57. }
  58. request = failedOperations;
  59. result = client.batchGetRow(request);
  60. } while (true);
  61. System.out.println(String.format("Get row finish, succeeded count:%d", succeedRows.size()));
  62. } catch (ClientException ex) {
  63. System.out.println("Batch get row failed.");
  64. } catch (OTSException ex) {
  65. System.out.println("Batch get row failed.");
  66. }

提示:

批量寫(BatchWriteRow)

批量插入、修改或刪除一個或多個表中的若幹行數據。

BatchWriteRow 操作可視為多個 PutRow、UpdateRow、DeleteRow 操作的集合,各個操作獨立執行,獨立返回結果,獨立計算服務能力單元。

接口

  1. /**
  2. * 對多張表(Table)中的多行數據進行增加、刪除或者更改操作。
  3. *
  4. * @param batchWriteRowRequest 執行BatchWriteRow操作所需參數的封裝。
  5. * @return BatchWriteRow操作的響應內容。
  6. * @throws OTSException OTS訪問返回錯誤消息
  7. * @throws ClientException 請求的返回結果無效, 或由於網絡原因請求失敗, 或訪問超時。
  8. */
  9. public BatchWriteRowResult batchWriteRow(
  10. BatchWriteRowRequest batchWriteRowRequest) throws OTSException,
  11. ClientException;

示例

批量導入 30 行數據。

  1. try
  2. {
  3. BatchWriteRowRequest request = new BatchWriteRowRequest();
  4. // 向3張表中插入數據, 每張表插入10行。
  5. for (int i = 0; i < 3; ++i) {
  6. for (int j = 0; j < 10; ++j) {
  7. RowPutChange rowPutChange = new RowPutChange("SampleTable" + i);
  8. RowPrimaryKey primaryKey = new RowPrimaryKey();
  9. primaryKey.addPrimaryKeyColumn("pk0", PrimaryKeyValue.fromLong(i));
  10. primaryKey.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromLong(j));
  11. rowPutChange.setPrimaryKey(primaryKey);
  12. rowPutChange.addAttributeColumn("col0", ColumnValue.fromLong(4));
  13. rowPutChange.addAttributeColumn("col2", ColumnValue.fromString("成杭京"));
  14. request.addRowPutChange(rowPutChange);
  15. }
  16. }
  17. // batchWriteRow接口會返回一個結果集, 結果集中包含的結果個數與插入的行數相同。 結果集中的結果不一定都是成功,用戶需要自己對不成功的操作進行重試。
  18. BatchWriteRowResult result = client.batchWriteRow(request);
  19. // 重試邏輯類似於上麵的batchGetRow示例中的邏輯,這裏省略
  20. } catch (ClientException ex) {
  21. System.out.println("Batch write row failed.");
  22. } catch (OTSException ex) {
  23. System.out.println("Batch write row failed.");
  24. }

提示:

範圍讀(GetRange)

讀取指定主鍵範圍內的數據。

接口

  1. /**
  2. * 從表(Table)中查詢一個範圍內的多行數據。
  3. *
  4. * @param getRangeRequest 執行GetRange操作所需參數的封裝。
  5. * @return GetRange操作的響應內容。
  6. * @throws OTSException OTS訪問返回錯誤消息
  7. * @throws ClientException 請求的返回結果無效, 或由於網絡原因請求失敗, 或訪問超時。
  8. */
  9. public GetRangeResult getRange(GetRangeRequest getRangeRequest)
  10. throws OTSException, ClientException;

示例

按照範圍讀取。

  1. try
  2. {
  3. // 這裏查找uid從1-4(左閉右開)的數據
  4. RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("SampleTable");
  5. RowPrimaryKey inclusiveStartKey = new RowPrimaryKey();
  6. inclusiveStartKey.addPrimaryKeyColumn("pk0", PrimaryKeyValue.fromLong(1));
  7. // 範圍的邊界需要提供完整的PK,若查詢的範圍不涉及到某一列值的範圍,則需要將該列設置為無窮大或者無窮小
  8. inclusiveStartKey.addPrimaryKeyColumn("pk1", PrimaryKeyValue.INF_MIN);
  9. RowPrimaryKey exclusiveEndKey = new RowPrimaryKey();
  10. exclusiveEndKey.addPrimaryKeyColumn("pk0", PrimaryKeyValue.fromLong(4));
  11. // 範圍的邊界需要提供完整的PK,若查詢的範圍不涉及到某一列值的範圍,則需要將該列設置為無窮大或者無窮小
  12. exclusiveEndKey.addPrimaryKeyColumn("pk1", PrimaryKeyValue.INF_MAX);
  13. criteria.setInclusiveStartPrimaryKey(inclusiveStartKey);
  14. criteria.setExclusiveEndPrimaryKey(exclusiveEndKey);
  15. // 前向查詢
  16. criteria.setDirection(Direction.FORWARD);
  17. // 最多返回10行
  18. criteria.setLimit(10);
  19. // 構造RangeRequest對象
  20. GetRangeRequest request = new GetRangeRequest();
  21. request.setRangeRowQueryCriteria(criteria);
  22. // 調用getRange接口
  23. GetRangeResult result = client.getRange(request);
  24. // 輸出數據
  25. List<Row> rows = result.getRows();
  26. for (Row row : rows) {
  27. System.out.println("col0:" + row.getColumns().get("col0"));
  28. System.out.println("col1:" + row.getColumns().get("col1"));
  29. System.out.println("col2:" + row.getColumns().get("col2"));
  30. }
  31. int consumedReadCU = result.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit();
  32. System.out.println("consumed capacityunit:" + consumedReadCU);
  33. System.out.println("Get range succeeded");
  34. } catch (ClientException ex) {
  35. System.out.println("Get range failed.");
  36. } catch (OTSException ex) {
  37. System.out.println("Get range failed.");
  38. }

提示:

  • 按範圍讀也支持通過條件語句過濾。

  • 詳細代碼:GetRange@GitHub

迭代讀(GetByIterator)

迭代讀取數據。

接口

  1. /**
  2. * 從表(Table)中迭代讀取滿足條件的數據
  3. * @param rangeIteratorParameter
  4. * 迭代讀時的參數,包括開始,結束位置
  5. * @return 迭代器
  6. * @throws OTSException
  7. * OTS訪問返回錯誤消息
  8. * @throws ClientException
  9. * 請求的返回結果無效, 或由於網絡原因請求失敗, 或訪問超時。
  10. */
  11. public Iterator<Row> createRangeIterator(
  12. RangeIteratorParameter rangeIteratorParameter)
  13. throws OTSException, ClientException;

示例

迭代讀取表 SampleTable 中的數據。

  1. // 構造迭代讀取的起始位置
  2. RowPrimaryKey inclusiveStartKey = new RowPrimaryKey();
  3. inclusiveStartKey.addPrimaryKeyColumn(COLUMN_GID_NAME,
  4. PrimaryKeyValue.fromLong(1));
  5. inclusiveStartKey.addPrimaryKeyColumn(COLUMN_UID_NAME,
  6. PrimaryKeyValue.INF_MIN);
  7. // 構造迭代讀取的結束位置
  8. RowPrimaryKey exclusiveEndKey = new RowPrimaryKey();
  9. exclusiveEndKey.addPrimaryKeyColumn(COLUMN_GID_NAME,
  10. PrimaryKeyValue.fromLong(4));
  11. exclusiveEndKey.addPrimaryKeyColumn(COLUMN_UID_NAME,
  12. PrimaryKeyValue.INF_MAX);
  13. // 構造迭代讀取的參數對象,並設置起始和結束的位置,包括起始位置的行,不包括結束位置的行
  14. RangeIteratorParameter rangeIteratorParameter = new RangeIteratorParameter(tableName);
  15. rangeIteratorParameter.setInclusiveStartPrimaryKey(inclusiveStartKey);
  16. rangeIteratorParameter.setExclusiveEndPrimaryKey(exclusiveEndKey);
  17. // 創建出迭代器,並迭代獲取每一行數據
  18. try {
  19. Iterator<Row> iterator = client.createRangeIterator(rangeIteratorParameter);
  20. while (iterator.hasNext()) {
  21. Row row = iterator.next();
  22. System.out.println("name:" + row.getColumns().get(COLUMN_NAME_NAME));
  23. System.out.println("address" + row.getColumns().get(COLUMN_ADDRESS_NAME));
  24. }
  25. System.out.println("Iterator get succeeded.");
  26. } catch (ClientException ex) {
  27. System.out.println("Iterator get failed.");
  28. } catch (OTSException ex) {
  29. System.out.println("Iterator get failed.");
  30. }

提示:

最後更新:2016-11-23 16:04:09

  上一篇:go 單行數據操作__Java-SDK_SDK 參考_表格存儲-阿裏雲
  下一篇:go 條件更新__Java-SDK (NEW)_SDK 參考_表格存儲-阿裏雲