スキップしてコンテンツを表示

Athena の "COLUMN_NOT_FOUND" エラーを解決する方法を教えてください。

所要時間2分
0

Amazon Athena クエリを実行したときに発生する "COLUMN_NOT_FOUND" エラーを解決したいと考えています。

簡単な説明

指定した列がテーブルのスキーマ定義にない場合、次のいずれかのエラーメッセージが表示されます。

  • "COLUMN_NOT_FOUND: line 1:8: Column 'column_name' cannot be resolved or requester is not authorized to access requested resources"
  • "COLUMN_NOT_FOUND: line 1:8: Relation contains no accessible columns"

テーブルにアクセスするための適切な AWS Lake Formation アクセス許可がない場合は、次のいずれかのエラーメッセージが表示されます。

  • "INVALID_VIEW: line 1:15: Failed analyzing stored view 'awsdatacatalog.database-name.view-name': line 1:8: Relation contains no accessible columns"
  • "COLUMN_NOT_FOUND: Column 'column_name' cannot be resolved or requester is not authorized to access requested resources"

表示されたエラーメッセージに応じて、問題をトラブルシューティングしてください。

解決策

列がテーブルの定義に含まれていることを確認する

列が存在しないため、テーブルのスキーマ定義に含まれていない可能性があります。列がテーブルのスキーマに存在することを確認するには、AWS Glue コンソールまたは AWS CLI を使用します。

AWS Glue コンソール

次の手順を実行します。

  1. AWS Glue コンソールを開きます。
  2. ナビゲーションペインで [データカタログ] を選択してから、[テーブル] を選択します。
  3. テーブルを選択します。
  4. [スキーマ] でスキーマを表示して、テーブルが存在することを確認します。

AWS CLI

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

次の get-table CLI コマンドを実行します。

aws glue get-table --database-name database-name --name table-name

注: database-nametable-name を、ご使用のデータベースとテーブルの名前に置き換えてください。

テーブルの定義に列を追加する

列がテーブルのスキーマ定義に存在しない場合は、AWS Glue コンソールまたは Athena クエリエディタを使用して列を追加します。

AWS Glue コンソール

次の手順を実行します。

  1. AWS Glue コンソールを開きます。
  2. ナビゲーションペインで [データカタログ] を選択してから、[テーブル] を選択します。
  3. テーブルを選択し、[スキーマの編集] を選択します。
  4. [追加] を選択します。
  5. [スキーマエントリの追加] ウィンドウで、次のセクションに値を追加します。<br id=hardline_break/> [列 #] には、新しい列を挿入したい位置の直前の列番号を入力します。例えば、新しい列をテーブルのスキーマの 3 番目の列にする場合は、「2」と入力します。<br id=hardline_break/> [名前] に、新しい列の名前を入力します。<br id=hardline_break/> [データタイプ] でデータタイプを選択します。
  6. [保存] を選択し、[新しいテーブルバージョンとして保存] を選択します。

Athena クエリエディタ

次の手順を実行します。

  1. Athena コンソールを開きます。
  2. ナビゲーションペインで、[クエリエディタ] を選択します。
  3. 次の ALTER TABLE ADD COLUMNS DDL ステートメントを実行します。
    ALTER TABLE table-name ADD COLUMNS (column-name column-data-type)
    注: table-name をご使用のテーブル名に置き換えてください。また、column-namecolumn-data-type を、新しい列に必要な名前とデータタイプに置き換えてください。

同じ AWS アカウント内のテーブルまたはビューをクエリするための Lake Formation アクセス許可を付与する

次の手順を実行します。

  1. データレイク管理者として Lake Formation コンソールを開きます。
  2. ナビゲーションペインで、[テーブル] または [ビュー] を選択します。
  3. テーブルまたはビューを選択し、[アクション] を選択します。
  4. ドロップダウンメニューで [付与] を選択します。
  5. [プリンシパル][IAM ユーザーとロール] を選択します。
  6. [IAM ユーザーとロール] で、アクセスを付与する AWS Identity and Access Management (IAM) ユーザーまたはプリンシパルを選択します。
  7. [LF タグまたはカタログリソース] で、[名前付きデータカタログリソース] を選択した後、カタログ、データベース、およびテーブルまたはビューを選択します。
  8. [テーブルの許可] または [ビューの許可]、および [付与可能なアクセス許可] で、付与するアクセス許可を選択します。<br id=hardline_break/> 注: テーブルまたはビューをクエリするには、[選択] および [説明] を選択する必要があります。
  9. [付与] を選択します。

注: データフィルターを使用する場合は、Column-level access が正しく設定されていることを確認してください。[列を含める] を選択した場合は、必ず対象の列を含めてください。[列を除外する] を選択した場合は、対象の列を除外しないでください。

別のアカウントのテーブルをクエリするアクセス許可を付与する

まず、リソースリンクを作成します。次に、リソースリンクとターゲットテーブルのアクセス許可を付与します。

リソースリンクのアクセス許可を付与するには、次の手順を実行します。

  1. 送信先アカウントで、データレイク管理者として Lake Formation コンソールを開きます。
  2. ナビゲーションペインで、[テーブル] を選択します。
  3. リソースリンクを選択し、[アクション] を選択します。
  4. ドロップダウンメニューで [付与] を選択します。
  5. [プリンシパル][IAM ユーザーとロール] を選択します。
  6. [IAM ユーザーとロール] で、アクセスを付与する IAM ユーザーまたはプリンシパルを選択します。
  7. [LF タグまたはカタログリソース] で、カタログ、データベース、テーブルを選択します。
  8. [リソースリンクのアクセス許可][付与可能なアクセス許可][説明] を選択します。
  9. [付与] を選択します。

ターゲットテーブルにアクセス許可を付与するには、上記の手順を繰り返します。ステップ 4 では [ターゲットに付与] を選択し、ステップ 8 では [選択] を選択します。

関連情報

Athena DynamoDB コネクタの「列が見つかりません」エラーを解決する方法を教えてください

AWS公式更新しました 6ヶ月前
コメントはありません

関連するコンテンツ