Tablestore は、テーブルからデータを読み取るための複数の操作を提供します。具体的には、単一のデータ行の読み取り、複数行のデータの一括読み取り、主キー値が指定された範囲内にあるデータの読み取り、イテレータを使用したデータの読み取り、および並列クエリでのデータの読み取りを行うことができます。
クエリメソッド
Tablestore は、データを読み取るための GetRow、BatchGetRow、および GetRange 操作を提供します。データを読み取る前に、実際のクエリシナリオに基づいて適切なクエリメソッドを選択してください。
自動インクリメント主キー列を含むテーブルからデータを読み取る場合は、自動インクリメント主キー列の値を含むすべての主キー列の値をクエリしていることを確認してください。詳細については、自動インクリメント主キー列の設定 を参照してください。自動インクリメント主キー列に値が記録されていない場合は、GetRange 操作を呼び出して、最初の主キー列の主キー値に基づいてデータを読み取る範囲を指定できます。
クエリメソッド | 説明 | シナリオ |
GetRow 操作を呼び出して、単一のデータ行を読み取ることができます。 | このメソッドは、テーブルのすべての主キー列を特定でき、読み取る行数が少ないシナリオに適用できます。 | |
BatchGetRow 操作を呼び出して、1つまたは複数のテーブルから複数行のデータを一度に読み取ることができます。 BatchGetRow 操作は、複数の GetRow 操作で構成されます。サブ操作を構築するプロセスは、GetRow 操作を呼び出すプロセスと同じです。 | このメソッドは、テーブルのすべての主キー列を特定でき、読み取る行数が多い場合、または複数のテーブルからデータを読み取るシナリオに適用できます。 | |
GetRange 操作を呼び出して、主キー値が指定された範囲内にあるデータを読み取ることができます。 GetRange 操作を使用すると、主キー値が指定された範囲内にあるデータを前方または後方に読み取ることができます。また、読み取る行数を指定することもできます。範囲が広く、スキャンされた行数またはスキャンされたデータの量が上限を超えると、スキャンは停止し、読み取られた行と次の行の主キーに関する情報が返されます。前回の操作で返された次の行の主キー情報に基づいて、最後の操作が中断された場所から開始し、残りの行を読み取るリクエストを開始できます。 | このメソッドは、テーブルのすべての主キー列の範囲、または主キー列のプレフィックスを特定できるシナリオに適用できます。 重要 主キー列のプレフィックスを特定できない場合は、データが INF_MIN タイプの開始主キー列と、データが INF_MAX タイプの終了主キー列を指定して、テーブルのすべての主キー列の範囲を特定できます。この操作はテーブル内のすべてのデータをスキャンしますが、大量の計算リソースを消費します。注意して進めてください。 | |
GetRangeIterator 操作を呼び出して、イテレータを使用して、主キー値が指定された範囲内にあるデータを読み取ることができます。 | このメソッドは、テーブルのすべての主キー列の範囲、または主キー列のプレフィックスを特定でき、データを読み取るためにイテレータが必要なシナリオに適用できます。 |
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化 を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成 および データの書き込み を参照してください。
単一のデータ行の読み取り
GetRow 操作を呼び出して、単一のデータ行を読み取ることができます。 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 | 読み取ることができるデータバージョンの最大数。 重要 maxVersions パラメータと timeRange パラメータの少なくとも一方を指定する必要があります。
|
timeRange | 読み取るバージョンの時間範囲、または特定のバージョン。詳細については、TimeRange を参照してください。 重要 maxVersions パラメータと timeRange パラメータの少なくとも一方を指定する必要があります。
specific_time と timeRange パラメータの有効な値:0 から |
filter | サーバー側でクエリ結果をフィルタリングするために使用するフィルター。フィルター条件を満たす行のみが返されます。詳細については、フィルターの使用 を参照してください。 説明 columnsToGet パラメータと filter パラメータの両方を指定した場合、Tablestore は columnsToGet パラメータで指定された列をクエリし、フィルター条件を満たす行を返します。 |
サンプルコード
データ行の読み取り
次のサンプルコードは、データ行を読み取る方法の例を示しています。
// 行の主キー情報を指定します。主キー情報は、テーブルの作成時に TableMeta で指定された主キー情報と同じである必要があります。
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(0));
primaryKey.Add("pk1", new ColumnValue("abc"));
try
{
// クエリリクエストオブジェクトを構築します。列を指定しない場合は、行全体が読み取られます。
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 以外です。
// 行のプライマリキー情報を指定します。プライマリキー情報は、テーブルの作成時に TableMeta で指定されたプライマリキー情報と同じである必要があります。
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"));
// 条件 1 と条件 2 の組み合わせを構築します。条件は OR 演算子を使用して評価されます。
var filter = new CompositeCondition(CompositeCondition.LogicOperator.OR);
filter.AddCondition(filter1);
filter.AddCondition(filter2);
rowQueryCriteria.Filter = filter;
// col0 と col1 を読み取る列として指定します。Tablestore は col0 列と col1 列の値をクエリし、フィルター条件を満たす行を返します。
rowQueryCriteria.AddColumnsToGet("col0");
rowQueryCriteria.AddColumnsToGet("col1");
// GetRowRequest オブジェクトを構築します。
var request = new GetRowRequest(rowQueryCriteria);
try
{
// クエリを実行します。
var response = otsClient.GetRow(request);
// データを返すか、関連する論理演算を実行します。この例では、データの返却または関連する論理演算の実行に使用されるコードは省略されています。
// 操作が成功した場合、例外は返されません。
Console.WriteLine("Get row with filter succeeded.");
}
catch (Exception ex)
{
// 操作が失敗した場合、例外が返されます。例外を処理します。
Console.WriteLine("Get row with filter failed, exception:{0}", ex.Message);
}
詳細なサンプルコードを確認するには、GitHub の GetRowWithFilter を参照してください。
一度に複数の行のデータを読み取る
BatchGetRowオペレーションを呼び出して、一度に1つ以上のテーブルから複数の行のデータを読み取ることができます。BatchGetRowオペレーションは、複数のGetRowオペレーションで構成されています。BatchGetRowオペレーションを呼び出す場合、各GetRowオペレーションを構成するプロセスは、GetRowオペレーションを呼び出す場合のGetRowオペレーションを構成するプロセスと同じです。
BatchGetRowオペレーションを呼び出すと、各GetRowオペレーションは個別に実行され、Tablestoreは各GetRowオペレーションへの応答を個別に返します。
使用上の注意
BatchGetRowオペレーションを呼び出して一度に複数の行を読み取ると、一部の行の読み取りに失敗する場合があります。このような場合、Tablestoreは例外を返さず、失敗した行の情報を含むBatchGetRowResponseを返します。そのため、BatchGetRowオペレーションを呼び出す場合は、戻り値を確認して、各行からデータが正常に読み取られたかどうかを確認する必要があります。
BatchGetRowオペレーションでは、すべての行に同じパラメータ設定が使用されます。たとえば、
ColumnsToGet
パラメータが[colA]に設定されている場合、すべての行からcolA列の値のみが読み取られます。BatchGetRowオペレーションを呼び出して、一度に最大100行を読み取ることができます。
API操作
/// <summary>
/// <para>一度に1つ以上のテーブルから複数の行のデータを読み取ります。</para>
/// <para>BatchGetRow操作は、GetRow操作のセットです。各操作は独立して実行され、結果を返し、消費された容量ユニット(CU)を計算します。</para>
/// 多数のGetRow操作と比較して、BatchGetRow操作は応答時間を短縮し、データ読み取り速度を向上させることができます。
/// </summary>
/// <param name="request">リクエストインスタンス</param>
/// <returns>レスポンスインスタンス</returns>
public BatchGetRowResponse BatchGetRow(BatchGetRowRequest request);
/// <summary>
/// BatchGetRowの非同期モード。
/// </summary>
public Task<BatchGetRowResponse> BatchGetRowAsync(BatchGetRowRequest request);
サンプルコード
次のサンプルコードは、一度に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);
// BatchGetRow操作を呼び出して、10行のデータを読み取ります。
var response = otsClient.BatchGetRow(request);
var tableRows = response.RowDataGroupByTable;
var rows = tableRows[TableName];
// 行のデータを返します。この例では、行のデータを返すために使用されるサンプルコードは省略されています。詳細なサンプルコードを表示するには、このサンプルコードに提供されているGitHubリンクにアクセスしてください。
// BatchGetRow操作を呼び出して一度に複数の行を読み取ると、一部の行の読み取りに失敗する場合があります。戻り値を確認して、各行からデータが正常に読み取られたかどうかを確認する必要があります。詳細なサンプルコードを表示するには、このサンプルコードに提供されているGitHubリンクにアクセスしてください。
}
catch (Exception ex)
{
// 操作が失敗した場合、例外が返されます。例外を処理します。
Console.WriteLine("Batch get row failed, exception:{0}", ex.Message);
}
詳細なサンプルコードを表示するには、BatchGetRow@GitHubにアクセスしてください。
特定の範囲内のプライマリキー値を持つデータの読み取り
GetRangeオペレーションを呼び出して、プライマリキー値が指定された範囲内にあるデータを読み取ることができます。
GetRangeオペレーションを使用すると、プライマリキー値が指定された範囲内にあるデータを順方向または逆方向に読み取ることができます。読み取る行数を指定することもできます。範囲が広く、スキャンされた行数またはスキャンされたデータの量が上限を超えると、スキャンは停止し、読み取られた行と次の行のプライマリキーに関する情報が返されます。前回のオペレーションが中断したところから開始するリクエストを開始し、前回のオペレーションによって返された次の行のプライマリキー情報に基づいて残りの行を読み取ることができます。
Tablestoreテーブルでは、すべての行はプライマリキーでソートされています。テーブルのプライマリキーは、すべてのプライマリキー列で順番に構成されます。したがって、行は特定のプライマリキー列に基づいてソートされません。
使用上の注意
GetRangeオペレーションは左端一致の原則に従います。Tablestoreは、プライマリキー値が指定された範囲内にあるデータを読み取るために、最初のプライマリキー列から最後のプライマリキー列まで順番に値を比較します。たとえば、データテーブルのプライマリキーがPK1、PK2、PK3というプライマリキー列で構成されているとします。データの読み取り時に、Tablestoreはまず、行のPK1値が最初のプライマリキー列に指定された範囲内にあるかどうかを判断します。行のPK1値が範囲内にある場合、Tablestoreは、行の他のプライマリキー列の値が各プライマリキー列に指定された範囲内にあるかどうかの判断を停止し、行を返します。行のPK1値が範囲内にない場合、Tablestoreは、PK1と同じ方法で、行の他のプライマリキー列の値が各プライマリキー列に指定された範囲内にあるかどうかを判断し続けます。
次のいずれかの条件が満たされると、GetRangeオペレーションは停止してデータを返す場合があります。
スキャンされたデータ量が4 MBに達する。
スキャンされた行数が5,000に達する。
返された行数が上限に達する。
予約済みの読み取りスループットがすべて消費されているため、読み取りスループットが次のデータ行を読み取るのに不十分である。
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の2つのプライマリキー値があり、値Aは値Bよりも小さいとします。 directionパラメータをFORWARDに設定し、テーブルに |
inclusiveStartPrimaryKey | 読み取る範囲の開始プライマリキー情報と終了プライマリキー情報。開始プライマリキー列と終了プライマリキー列は、有効なプライマリキー列、またはデータ型がINF_MIN型とINF_MAX型の仮想列である必要があります。仮想列で指定された範囲の列数は、指定されたテーブルのプライマリキー列の数と同じである必要があります。 INF_MINは無限に小さい値を示します。他のすべての型の値は、INF_MIN型の値よりも大きくなります。 INF_MAXは無限に大きい値を示します。他のすべての型の値は、INF_MAX型の値よりも小さくなります。
テーブル内の行は、プライマリキー値に基づいて昇順でソートされます。データの読み取りに使用される範囲は、左閉右開区間です。順方向にデータを読み取る場合、プライマリキー値が開始プライマリキー値以上で終了プライマリキー値未満の行が返されます。 |
exclusiveEndPrimaryKey | |
limit | 返される行の最大数。このパラメータの値は0より大きくなければなりません。 Tablestoreは、順方向または逆方向に返される行の最大数に達すると、指定された範囲内の一部の行が返されない場合でも、操作を停止します。レスポンスで返されたnextStartPrimaryKeyパラメータの値を使用して、次のリクエストでデータを読み取ることができます。 |
columnsToGet | 読み取る列。プライマリキー列または属性列の名前を指定できます。
説明
|
maxVersions | 読み取ることができるデータバージョンの最大数。 重要 maxVersionsパラメータとtimeRangeパラメータの少なくとも一方を指定する必要があります。
|
timeRange | 読み取るバージョンの時間範囲、または特定のバージョン。詳細については、TimeRangeを参照してください。 重要 maxVersionsパラメータとtimeRangeパラメータの少なくとも一方を指定する必要があります。
specific_timeと timeRangeパラメータの有効な値:0~ |
filter | サーバー側でクエリ結果をフィルタリングするために使用するフィルター。フィルター条件を満たす行のみが返されます。詳細については、フィルターの設定を参照してください。 説明 columnsToGetパラメータとfilterパラメータの両方を指定すると、TablestoreはcolumnsToGetパラメータで指定された列をクエリし、フィルター条件を満たす行を返します。 |
nextStartPrimaryKey | 次の読み取りリクエストの開始プライマリキー情報。 nextStartPrimaryKeyパラメータの値を使用して、すべてのデータが読み取られたかどうかを判断できます。
|
サンプルコード
次のサンプルコードは、プライマリキー値が指定された範囲内にあるデータを読み取る方法の例を示しています。
// プライマリキー値が(0, INF_MIN)から(100, INF_MAX)の範囲内にあるすべての行を読み取ります。
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);
// データの一部のみが返された場合は、読み取り操作を続行します。
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("範囲の取得に成功しました");
}
catch (Exception ex)
{
// 操作が失敗した場合、例外が返されます。例外を処理します。
Console.WriteLine("範囲の取得に失敗しました。例外:{0}", ex.Message);
}
詳細なサンプルコードを表示するには、GetRange@GitHubにアクセスしてください。
特定の範囲内のプライマリキー値を持つデータのイテレータを使用した読み取り
GetRangeIterator オペレーションを呼び出すことで、指定された範囲内のプライマリキー値を持つデータをイテレータを使用して読み取ることができます。
API オペレーション
/// <summary>
/// プライマリキー値が指定された範囲内にある複数の行からデータを取得します。各データ行を処理するために使用されるイテレータを返します。
/// </summary>
/// <param name="request"><see cref="GetIteratorRequest"/></param>
/// <returns><see cref="RowDataFromGetRange"/> イテレータを返します。</returns>
public IEnumerable<RowDataFromGetRange> GetRangeIterator(GetIteratorRequest request);
サンプルコード
次のサンプルコードは、プライマリキー値が (0, "a")
から (1000, "xyz")
の範囲内にあるすべての行を読み取る方法の例を示しています。
// プライマリキー値が (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"));
// イテレーションによって消費される CU 数を記録するための CapacityUnit オブジェクトを構築します。
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("行の反復処理に成功しました");
}
catch (Exception ex)
{
Console.WriteLine("行の反復処理に失敗しました。例外: {0}", ex.Message);
}
詳細なサンプルコードについては、GetRangeIterator@GitHub を参照してください。