第6章 表の行の読取り

目次

読取りの例外
単一行の取得
子表の取得
multiGet()の使用
表の行の反復使用
フィールド範囲の指定
ネストされた表の反復使用
索引の読取り
パラレル・スキャン
一括取得操作

ストアから表の行を取得するにはいくつかの方法があります。次の選択肢があります。

  1. TableAPI.get()メソッドを使用して一度に1つの行を取得します。

  2. TableAPI.multiGet()またはTableAPI.multiGetIterator()メソッドを使用して、シャード・キー(少なくとも主キーの一部に基づく)に関連付けられた行を取得します。

  3. TableAPI.tableIterator()メソッドを使用して、シャード・キーまたは索引キーを共有する表の行を取得します。

  4. 検索条件として1つのキーを使用し、各シャードのレコードを並列で取得および処理します。パラレル・スキャンが含まれるTableAPI.tableIterator()メソッドとTableAPI.tableKeysIterator()メソッドのいずれかを使用します。

  5. 検索条件としてキーのシーケンスを使用し、各シャードのレコードを並列で取得および処理します。一括取得が含まれるTableAPI.tableIterator()メソッドとTableAPI.tableKeysIterator()メソッドのいずれかを使用します。

それぞれの詳細は次の各項で説明します。

読取りの例外

ストアで読取り操作を行うと、いくつかの例外が発生します。1つ目は、ConsistencyExceptionです。この例外は、一貫性ポリシーが満たされないため、操作を完了できないことを表します。詳細は、「一貫性保証」を参照してください。

2つ目の例外はRequestTimeoutExceptionです。これは、ストアのタイムアウト・プロパティで指定された時間内に操作を完了できなかったことを表します。ストアで一度に多くの読取りリクエストをサービスしようとしていることを示している可能性があります。データは、ストア内のシャード全体でパーティション化され、パーティション化は、シャード・キーに基づいて行われることに注意してください。1つのキーに対して多数の読取りリクエストが発生するようにキーを設計した場合、ストア内の一部のシャードがアイドルの場合でもリクエストのタイムアウトが発生することがあります。

リクエストのタイムアウトは、ネットワーク速度の低下やまったく反応しない状態を引き起こしているネットワークの問題を表していることもあります。

RequestTimeoutExceptionに対処するには、単にエラーを記録して続行するか、少しの間待ってから操作を再試行します。タイムアウト値を大きくして操作を再試行することもできます。

IllegalArgumentExceptionを受け取ることもできます。これは、ストアに書き込んでいるRowに主キーがない、または行が無効な場合にスローされます。

また、一貫性の問題やリクエスト・タイムアウトの問題以外でなんらかの例外が発生したことを表す一般的なFaultExceptionを受け取ることもあります。この対処法は、エラーを記録して続行するか、操作を再試行することのみです。

また、クライアントのメタデータが同期していない可能性があることを示すMetadataNotFoundExceptionを受け取ることもあります。これはFaultExceptionを拡張したものであり、アプリケーションが取得すると、メタデータ(特にTableAPI.getTable()によって取得された表ハンドル)のリフレッシュのニーズをトリガーします。

さらに、認証が必要なセキュア・ストアを使用している場合は、適切な認証資格証明を指定しないと、AuthenticationFailureExceptionまたはAuthenticationRequiredExceptionを受け取ることあります。セキュア・ストアを使用するときに、UnauthorizedExceptionを受け取ることもあります。これは、認証されたユーザーが、適切な権限を持たない操作を試行していることを意味します。