表の行の反復使用

Store.table_iterator()では、非アトミック表の反復を実行できます。

Store.table_iterator()では、一度にすべての行がまとめて返されることはありません。かわりに、イテレータ内の行のフェッチをバッチ処理し、使用可能な帯域幅を独占することなく、ネットワーク往復を最小限にします。また、このメソッドで返される行はソートされていません。

このメソッドでは1つの原子的操作にならないことに注意してください。取得がバッチ処理されるため、取得操作全体を行ううちに戻りセットが変更されることがあります。その結果、このメソッドを使用する場合、操作の原子性が失われます。

このメソッドでは、表内の行の未ソート走査を行えます。キーを指定しない場合、このメソッドは表のすべての行を反復します。

このメソッドを使用する場合、オプションで次のものを指定できます。

  • 次のものを指定できるMultiRowOptionsオブジェクト。

    • FieldRangeオブジェクト。指定したキーに対して取得される値の範囲を定義します。

    • 反復に含める親表と祖先表のリスト。

  • 反復方向、各取得バッチで返す結果の最大数およびReadOptionsクラスを指定できるTableIteratorOptionsオブジェクト。このクラスを使用すると、操作の一貫性ポリシーや、操作に許される時間の上限を指定できます。一貫性ポリシーの詳細は、一貫性保証を参照してください。

たとえば、次のように設計されている製品に関する情報を格納する表があるとします。

CREATE TABLE myTable (
    itemType STRING,
    itemCategory STRING,
    itemClass STRING,
    itemColor STRING,
    itemSize STRING,
    price FLOAT,
    inventoryCount INTEGER,
    PRIMARY KEY (SHARD(itemType, itemCategory, itemClass), itemColor,
    itemSize)
) 

次のようなデータを含む表:

  • 行1:

    • itemType: Hats

    • itemCategory: baseball

    • itemClass: longbill

    • itemColor: red

    • itemSize: small

    • price: 12.07

    • inventoryCount: 127

  • 行2:

    • itemType: Hats

    • itemCategory: baseball

    • itemClass: longbill

    • itemColor: red

    • itemSize: medium

    • price: 13.07

    • inventoryCount: 201

  • 行3:

    • itemType: Hats

    • itemCategory: baseball

    • itemClass: longbill

    • itemColor: red

    • itemSize: large

    • price: 14.07

    • inventoryCount: 39

  • n:

    • itemType: Coats

    • itemCategory: Casual

    • itemClass: Winter

    • itemColor: red

    • itemSize: large

    • price: 247.99

    • inventoryCount: 9

最も簡単な例では、次のようにStore.table_iterator()を使用して「Hats」に関連するすべての行を取得できます。この単純な例は、Store.multi_get()メソッドを使用して実行できることに注意してください。完全なシャード・キーがあり、結果セット全体がメモリーにおさまる場合、multi_get()table_iterator()よりも効率よく実行されます。ただし、結果セット全体がメモリーにおさまらない場合、または完全なシャード・キーがない場合、table_iterator()の方が優れた選択肢となります。table_iterator()を使用して実行される読取りは非原子的で、更新中のレコードに対して長時間の繰り返しを実行している場合には悪影響がある可能性があります。

def display_row(row):
    try:
            print "Retrieved row:"
            print "\tType: %s" % row['itemType']
            print "\tCategory: %s" % row['itemCategory']
            print "\tClass: %s" % row['itemClass']
            print "\tColor: %s" % row['itemColor']
            print "\tSize: %s" % row['itemSize']
            print "\tPrice: %s" % row['price']
            print "\tInventory Count: %s" % row['inventoryCount']
            print "\n"
    except KeyError, ke:
        logging.error("Row display failed. Bad key: %s" % ke.message)


def do_store_ops(store):

    key_d = {'itemType' : 'Hats'}

    try:
        row_list = store.table_iterator("myTable", key_d, False)
        if not row_list:
            logging.debug("Table retrieval failed")
        else:
            logging.debug("Table retrieval succeeded.")
            for r in row_list:
                display_row(r)
    except IllegalArgumentException, iae:
        logging.error("Table retrieval failed.")
        logging.error(iae.message)