すべてのプロダクト
Search
ドキュメントセンター

Tablestore:セカンダリインデックスを使用してデータを読み取る

最終更新日:Dec 28, 2024

Tablestoreでは、インデックステーブルから単一のデータ行、またはプライマリキー値が特定の範囲内にあるデータを読み取ることができます。インデックステーブルに返したい属性列が含まれている場合は、インデックステーブルを読み取ってデータを取得できます。そうでない場合は、インデックステーブルが作成されたデータテーブルからデータをクエリする必要があります。

前提条件

使用上の注意

  • インデックステーブルはデータの読み取りにのみ使用できます。

  • ローカルセカンダリインデックスの最初のプライマリキー列は、データテーブルの最初のプライマリキー列と同じである必要があります。

  • 返したい属性列がインデックステーブルに含まれていない場合は、インデックステーブルが作成されたデータテーブルからデータをクエリして、必要な属性列を取得する必要があります。

単一のデータ行を読み取る

GetRow操作を呼び出して、単一のデータ行を読み取ることができます。詳細については、単一のデータ行の読み取りを参照してください。

パラメーター

GetRow操作を呼び出してインデックステーブルからデータを読み取る場合は、次の項目に注意してください。

  • table_nameをインデックステーブルの名前に設定する必要があります。

  • Tablestoreは、インデックス列として指定されていないデータテーブルのプライマリキー列を、インデックステーブルのプライマリキー列としてインデックステーブルに自動的に追加します。したがって、インデックステーブルの行のプライマリキー列を指定する場合は、インデックステーブルを作成したインデックス列とデータテーブルのプライマリキー列に基づいて指定する必要があります。

次のサンプルコードは、行のプライマリキーに基づいてインデックステーブルのデータ行を読み取る方法の例を示しています。

# プライマリキーを構築します。インデックステーブルのプライマリキー列は、definedcol1、pk1、およびpk2で構成されます。pk2は、インデックステーブルのインデックス列として指定されていないデータテーブルのプライマリキー列です。3つのプライマリキー列はINTEGER型です。データを読み取るためのプライマリキー値は、definedcol1列では1、pk1列では101、pk2列では11です。
# ローカルセカンダリインデックスからデータを読み取る場合は、インデックステーブルの最初のプライマリキー列は、データテーブルの最初のプライマリキー列と同じである必要があります。
primary_key = [('definedcol1', 1), ('pk1', 101), ('pk2', 11)]

# 返したいインデックステーブルの属性列を指定します。この例では、definedcol2とdefinedcol3が指定されています。columns_to_getパラメータを[]に設定すると、インデックステーブルのすべての属性列が返されます。
columns_to_get = ['definedcol2', 'definedcol3']

# 列のフィルターを指定します。この例では、フィルターを使用して、definedcol2列の値が1ではなく、definedcol3列の値が「test」である行を返します。
cond = CompositeColumnCondition(LogicalOperator.AND)
cond.add_sub_condition(SingleColumnCondition("definedcol2", 1, ComparatorType.NOT_EQUAL))
cond.add_sub_condition(SingleColumnCondition("definedcol3", 'test', ComparatorType.EQUAL))

try:
    # get_row操作を呼び出してデータをクエリします。
    # インデックステーブルの名前を指定します。最後のパラメータ値1は、値の1つのバージョンのみが返されることを示します。
    consumed, return_row, next_token = client.get_row('<INDEX_NAME>', primary_key, columns_to_get, cond, 1)
    print('Read succeed, consume %s read cu.' % consumed.read)
    print('Value of primary key: %s' % return_row.primary_key)
    print('Value of attribute: %s' % return_row.attribute_columns)
    for att in return_row.attribute_columns:
        # 各列のキー、値、およびバージョンを表示します。
        print('name:%s\tvalue:%s' % (att[0], att[1]))
# ほとんどの場合、クライアント例外はパラメータエラーまたはネットワーク例外が原因で発生します。
except OTSClientError as e:
    print('get row failed, http_status:%d, error_message:%s' % (e.get_http_status(), e.get_error_message()))
# ほとんどの場合、サーバー例外はパラメータエラーまたはスロットリングエラーが原因で発生します。
except OTSServiceError as e:
    print('get row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s' % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id()))

プライマリキー値が特定の範囲内にあるデータを読み取る

GetRange操作を呼び出して、プライマリキー値が特定の範囲内にあるデータを読み取ることができます。詳細については、プライマリキー値が特定の範囲内にあるデータの読み取りを参照してください。

パラメーター

GetRange操作を呼び出してインデックステーブルからデータを読み取る場合は、次の項目に注意してください。

  • table_nameをインデックステーブルの名前に設定する必要があります。

  • Tablestoreは、インデックス列として指定されていないデータテーブルのプライマリキー列を、インデックステーブルのプライマリキー列としてインデックステーブルに自動的に追加します。したがって、クエリする範囲の開始プライマリキーと終了プライマリキーを指定する場合は、インデックステーブルを作成したインデックス列とデータテーブルのプライマリキー列に基づいて指定する必要があります。

次のサンプルコードは、セカンダリインデックスからプライマリキー値が特定の範囲内にあるデータを読み取る方法の例を示しています。

# 範囲の開始プライマリキーを構築します。ローカルセカンダリインデックスからデータを読み取る場合は、インデックステーブルの最初のプライマリキー列は、データテーブルの最初のプライマリキー列と同じである必要があります。
inclusive_start_primary_key = [('definedcol1', 1), ('pk1', INF_MIN), ('pk2', INF_MIN)]

# 範囲の終了プライマリキーを構築します。
exclusive_end_primary_key = [('definedcol1', 5), ('pk1', INF_MAX), ('pk2', INF_MIN)]

# クエリ条件を満たす行のすべての列が返されるように指定します。
columns_to_get = []

# limitパラメータを90に設定して、最大90行のデータを返します。合計100行がクエリ条件を満たす場合、最初の読み取り操作で返される行数は0から90の範囲になります。next_start_primary_keyパラメータの値はNoneではありません。
limit = 90

# 列のフィルターを指定します。この例では、フィルターを使用して、definedcol2列の値が50未満で、definedcol3列の値が「China」である行を返します。
cond = CompositeColumnCondition(LogicalOperator.AND)
# pass_if_missingパラメータを指定して、行に特定の列が含まれていない場合に、行がフィルター条件を満たすかどうかを決定します。
# pass_if_missingパラメータを指定しないか、パラメータをTrueに設定すると、行に特定の列が含まれていない場合、行はフィルター条件を満たします。
# pass_if_missingパラメータをFalseに設定すると、行に特定の列が含まれていない場合、行はフィルター条件を満たしません。
cond.add_sub_condition(SingleColumnCondition("definedcol3", 'China', ComparatorType.EQUAL, pass_if_missing=False))
cond.add_sub_condition(SingleColumnCondition("definedcol2", 50, ComparatorType.LESS_THAN, pass_if_missing=False))

try:
    # get_range操作を呼び出します。
    # インデックステーブルの名前を指定します。
    consumed, next_start_primary_key, row_list, next_token = client.get_range(
        '<INDEX_NAME>', Direction.FORWARD,
        inclusive_start_primary_key, exclusive_end_primary_key,
        columns_to_get,
        limit,
        column_filter=cond,
        max_version=1,
        time_range=(1557125059000, 1557129059000)  # データの時間範囲を指定します。この例では、開始時刻は1557125059000以上です。終了時刻は1557129059000未満です。
    )

    all_rows = []
    all_rows.extend(row_list)

    # next_start_primary_keyパラメータが空でない場合は、データの読み取りを続けます。
    while next_start_primary_key is not None:
        inclusive_start_primary_key = next_start_primary_key
        consumed, next_start_primary_key, row_list, next_token = client.get_range(
            '<INDEX_NAME>', Direction.FORWARD,
            inclusive_start_primary_key, exclusive_end_primary_key,
            columns_to_get, limit,
            column_filter=cond,
            max_version=1
        )
        all_rows.extend(row_list)

    # プライマリキー列と属性列を表示します。
    for row in all_rows:
        print(row.primary_key, row.attribute_columns)
    print('Total rows: ', len(all_rows))
# ほとんどの場合、クライアント例外はパラメータエラーまたはネットワーク例外が原因で発生します。
except OTSClientError as e:
    print('get row failed, http_status:%d, error_message:%s' % (e.get_http_status(), e.get_error_message()))
# ほとんどの場合、サーバー例外はパラメータエラーまたはスロットリングエラーが原因で発生します。
except OTSServiceError as e:
    print('get row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s' % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id()))

FAQ

関連情報

  • ビジネスで多次元クエリとデータ分析が必要な場合は、検索インデックスを作成し、必要な属性を検索インデックスのフィールドとして指定できます。その後、検索インデックスを使用してデータをクエリおよび分析できます。たとえば、検索インデックスを使用して、非プライマリキー列、ブールクエリ、あいまいクエリに基づいてクエリを実行できます。また、検索インデックスを使用して、最大値と最小値を取得したり、行数の統計を収集したり、クエリ結果をグループ化したりすることもできます。詳細については、検索インデックスを参照してください。

  • SQLステートメントを実行してデータをクエリおよび分析する場合は、SQLクエリ機能を使用できます。詳細については、SQLクエリを参照してください。