Tablestore では、テーブルからデータを読み取るための操作として、単一行の読み取り、バッチでの複数行読み取り、プライマリキー範囲のスキャン、イテレーターを使用した範囲内反復処理が提供されています。
クエリメソッド
Tablestore では、データ読み取り用に GetRow、BatchGetRow、GetRange の 3 つの操作が提供されています。クエリシナリオに応じて適切な操作を選択してください。
自動採番主キー列を持つテーブルから読み取る場合は、自動採番された値を含むすべてのプライマリキー列の値を事前に取得する必要があります。詳細については、「自動採番主キー列」をご参照ください。自動採番値が利用できない場合は、GetRange を使用して最初のプライマリキー列に基づいてスキャンしてください。
|
操作 |
説明 |
使用タイミング |
|
GetRow 操作を使用して、プライマリキーで単一行を読み取ります。 |
すべてのプライマリキー列が既知であり、少数の行を読み取る必要がある場合。 |
|
|
BatchGetRow 操作を使用して、1 回の呼び出しで 1 つ以上のテーブルから複数行を読み取ります。各行は独立して読み取られ、それぞれ独自の結果を返します。 |
すべてのプライマリキー列が既知であり、多数の行を読み取る必要がある場合、または複数のテーブルから読み取る場合。 |
|
|
GetRange 操作を使用して、指定された範囲内のプライマリキー値を持つ行をスキャンします。前方および後方スキャン、行数制限、および |
プライマリキー値の範囲またはプライマリキープレフィックスが特定できる場合。 重要
プレフィックスが不明な場合は、開始キーを INF_MIN、終了キーを INF_MAX に設定してテーブル全体をスキャンできます。ただし、この操作は大量の計算リソースを消費するため、注意して実行してください。 |
|
|
イテレーターを使用してプライマリキー範囲内の行を読み取ります。ページネーションは自動的に処理されます。 |
プライマリキー範囲またはプレフィックスが特定でき、ページネーションを手動で管理せずに結果を反復処理したい場合。 |
前提条件
作業を開始する前に、以下の準備が完了していることを確認してください。
OTSClient インスタンスが初期化されていること。詳細については、「OTSClient インスタンスの初期化」をご参照ください。
データが書き込まれたデータテーブルが作成済みであること。詳細については、「データテーブルの作成」および「データの書き込み」をご参照ください。
単一行のデータを読み取る
プライマリキーを使用して単一行を読み取るには、GetRow 操作を呼び出します。
API オペレーション
/// <summary>
/// 指定されたプライマリキーに基づいて単一行を読み取ります。
/// </summary>
/// <param name="request">データクエリリクエスト</param>
/// <returns>GetRow の応答</returns>
public GetRowResponse GetRow(GetRowRequest request);
/// <summary>
/// GetRow の非同期バージョン。
/// </summary>
public Task<GetRowResponse> GetRowAsync(GetRowRequest request);
パラメーター
|
パラメーター |
説明 |
|
tableName |
テーブル名。 |
|
primaryKey |
読み取る行のプライマリキー。カラム名、型、値を指定します。 重要
プライマリキー列の数と型は、テーブルスキーマと完全に一致している必要があります。 |
|
columnsToGet |
返すカラム(プライマリキー列または属性列)。省略した場合は、すべてのカラムが返されます。
説明
|
|
maxVersions |
返すデータバージョンの最大数。 重要
|
|
timeRange |
読み取るバージョンの時間範囲または特定のバージョン。詳細については、「TimeRange」をご参照ください。 重要
有効範囲:0 ~ |
|
filter |
データ取得後に適用されるサーバー側フィルター。フィルター条件に一致する行のみが返されます。詳細については、「フィルターの使用」をご参照ください。 説明
|
サンプルコード
データの行を読み取る
次のサンプルコードは、データの行を読み取る方法の例を示しています。
// プライマリキーを指定します。カラムと型はテーブルスキーマと一致している必要があります。
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(0));
primaryKey.Add("pk1", new ColumnValue("abc"));
try
{
// リクエストを構築します。columnsToGet を省略すると、行全体が返されます。
var request = new GetRowRequest(TableName, primaryKey);
// GetRow を呼び出します。
var response = otsClient.GetRow(request);
// 返された行データを処理します。
// (ここでは省略—完全な実装については GitHub のサンプルをご参照ください。)
Console.WriteLine("Get row succeeded.");
}
catch (Exception ex)
{
Console.WriteLine("Update table failed, exception:{0}", ex.Message);
}
詳細なサンプルコードについては、「GetRow@GitHub」をご覧ください。
フィルターを使用してデータの行を読み取る
次の例では、col0 および col1 を読み取り、col0 の値が 5 であるか、col1 の値が ff でない場合にのみ行を返します。
// プライマリキーを指定します。カラムと型はテーブルスキーマと一致している必要があります。
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(0));
primaryKey.Add("pk1", new ColumnValue("abc"));
var rowQueryCriteria = new SingleRowQueryCriteria("SampleTable");
rowQueryCriteria.RowPrimaryKey = primaryKey;
// 条件 1: col0 == 5
var filter1 = new RelationalCondition("col0",
RelationalCondition.CompareOperator.EQUAL,
new ColumnValue(5));
// 条件 2: col1 != "ff"
var filter2 = new RelationalCondition("col1", RelationalCondition.CompareOperator.NOT_EQUAL, new ColumnValue("ff"));
// OR で結合:いずれかの条件が満たされた場合に行を返します。
var filter = new CompositeCondition(CompositeCondition.LogicOperator.OR);
filter.AddCondition(filter1);
filter.AddCondition(filter2);
rowQueryCriteria.Filter = filter;
// col0 および col1 のみをフェッチし、その後フィルターを適用します。
rowQueryCriteria.AddColumnsToGet("col0");
rowQueryCriteria.AddColumnsToGet("col1");
var request = new GetRowRequest(rowQueryCriteria);
try
{
var response = otsClient.GetRow(request);
// 返された行データを処理します。
// (ここでは省略—完全な実装については GitHub のサンプルをご参照ください。)
Console.WriteLine("Get row with filter succeeded.");
}
catch (Exception ex)
{
Console.WriteLine("Get row with filter failed, exception:{0}", ex.Message);
}
詳細なサンプルコードについては、「GetRowWithFilter@GitHub」をご覧ください。
複数行のデータを一度に読み取る
1 回のリクエストで 1 つ以上のテーブルから複数行を読み取るには、BatchGetRow 操作を呼び出します。各行は独立した GetRow 呼び出しとして処理され、Tablestore は各行ごとに個別の結果を返します。
注意事項
バッチリクエスト内の一部の行が個別に失敗する可能性があります。これらの行のエラーは、例外としてスローされるのではなく、BatchGetRowResponse 内に表示されます。各行が正常に読み取られたかどうかを確認するために、常に応答を確認してください。
リクエスト内のすべての行に同じパラメーターが適用されます。たとえば、
ColumnsToGet=[colA]を設定すると、すべての行からcolAのみが読み取られます。1 回の BatchGetRow リクエストで読み取れる行の最大数は 100 行です。
API オペレーション
/// <summary>
/// 1 回の呼び出しで 1 つ以上のテーブルから複数行を読み取ります。
/// 各行は個別に読み取られ、個別に課金されますが、複数の GetRow 呼び出しと比較して
/// 往復のオーバーヘッドが削減されます。
/// </summary>
/// <param name="request">リクエストインスタンス</param>
/// <returns>応答インスタンス</returns>
public BatchGetRowResponse BatchGetRow(BatchGetRowRequest request);
/// <summary>
/// BatchGetRow の非同期バージョン。
/// </summary>
public Task<BatchGetRowResponse> BatchGetRowAsync(BatchGetRowRequest request);
サンプルコード
次の例では、1 回の BatchGetRow 呼び出しで 10 行を読み取ります。
// 10 行分のプライマリキーを構築します。
List<PrimaryKey> primaryKeys = new List<PrimaryKey>();
for (int i = 0; i < 10; i++)
{
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(i));
primaryKey.Add("pk1", new ColumnValue("abc"));
primaryKeys.Add(primaryKey);
}
try
{
BatchGetRowRequest request = new BatchGetRowRequest();
request.Add(TableName, primaryKeys);
var response = otsClient.BatchGetRow(request);
var tableRows = response.RowDataGroupByTable;
var rows = tableRows[TableName];
// 各行の結果を個別に確認します—一部の行が失敗している可能性があります。
// (ここでは省略—完全な実装については GitHub のサンプルをご参照ください。)
}
catch (Exception ex)
{
Console.WriteLine("Batch get row failed, exception:{0}", ex.Message);
}
詳細なサンプルコードについては、「BatchGetRow@GitHub」をご覧ください。
指定された範囲内のプライマリキー値を持つデータを読み取る
指定された範囲内のプライマリキー値を持つ行をスキャンするには、GetRange 操作を呼び出します。スキャン方向は前方または後方に設定でき、返される行数に上限を設けることも可能です。スキャンが制限(データ量、行数、予約済みスループット)に達すると、早期に停止し、nextStartPrimaryKey 値を返します。この値を後続のリクエストの開始キーとして使用し、残りの行を読み取ってください。
Tablestore テーブル内のすべての行は、個々のプライマリキー列ではなく、完全な複合プライマリキーでソートされています。
注意事項
GetRange は最左一致原則を使用します。Tablestore はプライマリキー列の値を左から右へ順に比較します。最初のプライマリキー列(PK1)の値が指定された範囲内にある場合、その行は返され、以降の列は評価されません。PK1 が範囲外の場合、Tablestore は同様の方法で残りの列を評価し続けます。
GetRange 操作は、以下のいずれかの制限に達すると早期に停止します。
スキャンされたデータが 4 MB に達した場合。
スキャンされた行数が 5,000 行に達した場合。
返された行数が指定された
limitに達した場合。次の行を読み取る前に予約済み読み取りスループットが枯渇した場合。
API オペレーション
/// <summary>
/// 指定された範囲内のプライマリキー値を持つ行を読み取ります。
/// </summary>
/// <param name="request">リクエストインスタンス</param>
/// <returns>応答インスタンス</returns>
public GetRangeResponse GetRange(GetRangeRequest request);
/// <summary>
/// GetRange の非同期バージョン。
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public Task<GetRangeResponse> GetRangeAsync(GetRangeRequest request);
パラメーター
|
パラメーター |
説明 |
|
tableName |
テーブル名。 |
|
direction |
スキャン方向。
たとえば、プライマリキー値 A と B(A < B)がある場合、direction を FORWARD に設定し、範囲を |
|
inclusiveStartPrimaryKey |
範囲の開始および終了プライマリキー。どちらも有効なプライマリキー列、または INF_MIN または INF_MAX 型の仮想カラムである必要があります。カラム数はテーブルのプライマリキースキーマと一致している必要があります。 INF_MIN は他のすべての値より小さいです。INF_MAX は他のすべての値より大きいです。
範囲は左閉右開区間です。前方方向では、キーが開始以上かつ終了未満の行が返されます。 |
|
exclusiveEndPrimaryKey |
|
|
limit |
返す行の最大数。0 より大きい値を指定する必要があります。 制限に達すると、スキャンは停止し、 |
|
columnsToGet |
返すカラム(プライマリキー列または属性列)。省略した場合は、すべてのカラムが返されます。
説明
|
|
maxVersions |
返すデータバージョンの最大数。 重要
|
|
timeRange |
読み取るバージョンの時間範囲または特定のバージョン。詳細については、「TimeRange」をご参照ください。 重要
有効範囲:0 ~ |
|
filter |
データ取得後に適用されるサーバー側フィルター。フィルター条件に一致する行のみが返されます。詳細については、「フィルターの設定」をご参照ください。 説明
|
|
nextStartPrimaryKey |
ページネーションされた応答時に返される、次の読み取りリクエストの開始キー。
|
サンプルコード
次の例では、プライマリキー値が (0, INF_MIN) から (100, INF_MAX) の間にあるすべての行をスキャンし、ページネーションを自動的に処理します。
// キー範囲を定義:pk0 は 0(含む)から 100(含まない)。
var inclusiveStartPrimaryKey = new PrimaryKey();
inclusiveStartPrimaryKey.Add("pk0", new ColumnValue(0));
inclusiveStartPrimaryKey.Add("pk1", ColumnValue.INF_MIN);
var exclusiveEndPrimaryKey = new PrimaryKey();
exclusiveEndPrimaryKey.Add("pk0", new ColumnValue(100));
exclusiveEndPrimaryKey.Add("pk1", ColumnValue.INF_MAX);
try
{
var request = new GetRangeRequest(TableName, GetRangeDirection.Forward,
inclusiveStartPrimaryKey, exclusiveEndPrimaryKey);
var response = otsClient.GetRange(request);
// nextStartPrimaryKey が null になるまで、すべての行を収集します。
var rows = response.RowDataList;
var nextStartPrimaryKey = response.NextPrimaryKey;
while (nextStartPrimaryKey != null)
{
request = new GetRangeRequest(TableName, GetRangeDirection.Forward,
nextStartPrimaryKey, exclusiveEndPrimaryKey);
response = otsClient.GetRange(request);
nextStartPrimaryKey = response.NextPrimaryKey;
foreach (RowDataFromGetRange row in response.RowDataList)
{
rows.Add(row);
}
}
// 収集したすべての行を処理します。
// (ここでは省略—完全な実装については GitHub のサンプルをご参照ください。)
Console.WriteLine("Get range succeeded");
}
catch (Exception ex)
{
Console.WriteLine("Get range failed, exception:{0}", ex.Message);
}
詳細なサンプルコードについては、「GetRange@GitHub」をご覧ください。
イテレーターを使用して指定された範囲内のプライマリキー値を持つデータを読み取る
イテレーターを使用してプライマリキー範囲をスキャンするには、GetRangeIterator 操作を呼び出します。GetRange とは異なり、イテレーターはページネーションを自動的に処理するため、nextStartPrimaryKey を確認して後続のリクエストを手動で発行する必要はありません。
API オペレーション
/// <summary>
/// 指定された範囲内のプライマリキー値を持つ行をスキャンします。
/// ページネーションを内部で処理し、1 行ずつ返すイテレーターを返します。
/// </summary>
/// <param name="request"><see cref="GetIteratorRequest"/></param>
/// <returns><see cref="RowDataFromGetRange"/> のイテレーター。</returns>
public IEnumerable<RowDataFromGetRange> GetRangeIterator(GetIteratorRequest request);
サンプルコード
次の例では、プライマリキー値が (0, "a") から (1000, "xyz") の間にあるすべての行を読み取ります。
PrimaryKey inclusiveStartPrimaryKey = new PrimaryKey();
inclusiveStartPrimaryKey.Add("pk0", new ColumnValue(0));
inclusiveStartPrimaryKey.Add("pk1", new ColumnValue("a"));
PrimaryKey exclusiveEndPrimaryKey = new PrimaryKey();
exclusiveEndPrimaryKey.Add("pk0", new ColumnValue(1000));
exclusiveEndPrimaryKey.Add("pk1", new ColumnValue("xyz"));
// 反復処理中に消費された容量単位を追跡します。
var cu = new CapacityUnit(0, 0);
try
{
// GetIteratorRequest ではフィルターがサポートされています。
var request = new GetIteratorRequest(TableName, GetRangeDirection.Forward, inclusiveStartPrimaryKey,
exclusiveEndPrimaryKey, cu);
var iterator = otsClient.GetRangeIterator(request);
foreach (var row in iterator)
{
// 各行を処理します。
}
Console.WriteLine("Iterate row succeeded");
}
catch (Exception ex)
{
Console.WriteLine("Iterate row failed, exception:{0}", ex.Message);
}
詳細なサンプルコードについては、「GetRangeIterator@GitHub」をご覧ください。