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 コンソール
次の手順を実行します。
- AWS Glue コンソールを開きます。
- ナビゲーションペインで [データカタログ] を選択してから、[テーブル] を選択します。
- テーブルを選択します。
- [スキーマ] でスキーマを表示して、テーブルが存在することを確認します。
AWS CLI
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
次の get-table CLI コマンドを実行します。
aws glue get-table --database-name database-name --name table-name
注: database-name と table-name を、ご使用のデータベースとテーブルの名前に置き換えてください。
テーブルの定義に列を追加する
列がテーブルのスキーマ定義に存在しない場合は、AWS Glue コンソールまたは Athena クエリエディタを使用して列を追加します。
AWS Glue コンソール
次の手順を実行します。
- AWS Glue コンソールを開きます。
- ナビゲーションペインで [データカタログ] を選択してから、[テーブル] を選択します。
- テーブルを選択し、[スキーマの編集] を選択します。
- [追加] を選択します。
- [スキーマエントリの追加] ウィンドウで、次のセクションに値を追加します。<br id=hardline_break/>
[列 #] には、新しい列を挿入したい位置の直前の列番号を入力します。例えば、新しい列をテーブルのスキーマの 3 番目の列にする場合は、「2」と入力します。<br id=hardline_break/>
[名前] に、新しい列の名前を入力します。<br id=hardline_break/>
[データタイプ] でデータタイプを選択します。
- [保存] を選択し、[新しいテーブルバージョンとして保存] を選択します。
Athena クエリエディタ
次の手順を実行します。
- Athena コンソールを開きます。
- ナビゲーションペインで、[クエリエディタ] を選択します。
- 次の ALTER TABLE ADD COLUMNS DDL ステートメントを実行します。
ALTER TABLE table-name ADD COLUMNS (column-name column-data-type)
注: table-name をご使用のテーブル名に置き換えてください。また、column-name と column-data-type を、新しい列に必要な名前とデータタイプに置き換えてください。
同じ AWS アカウント内のテーブルまたはビューをクエリするための Lake Formation アクセス許可を付与する
次の手順を実行します。
- データレイク管理者として Lake Formation コンソールを開きます。
- ナビゲーションペインで、[テーブル] または [ビュー] を選択します。
- テーブルまたはビューを選択し、[アクション] を選択します。
- ドロップダウンメニューで [付与] を選択します。
- [プリンシパル] で [IAM ユーザーとロール] を選択します。
- [IAM ユーザーとロール] で、アクセスを付与する AWS Identity and Access Management (IAM) ユーザーまたはプリンシパルを選択します。
- [LF タグまたはカタログリソース] で、[名前付きデータカタログリソース] を選択した後、カタログ、データベース、およびテーブルまたはビューを選択します。
- [テーブルの許可] または [ビューの許可]、および [付与可能なアクセス許可] で、付与するアクセス許可を選択します。<br id=hardline_break/>
注: テーブルまたはビューをクエリするには、[選択] および [説明] を選択する必要があります。
- [付与] を選択します。
注: データフィルターを使用する場合は、Column-level access が正しく設定されていることを確認してください。[列を含める] を選択した場合は、必ず対象の列を含めてください。[列を除外する] を選択した場合は、対象の列を除外しないでください。
別のアカウントのテーブルをクエリするアクセス許可を付与する
まず、リソースリンクを作成します。次に、リソースリンクとターゲットテーブルのアクセス許可を付与します。
リソースリンクのアクセス許可を付与するには、次の手順を実行します。
- 送信先アカウントで、データレイク管理者として Lake Formation コンソールを開きます。
- ナビゲーションペインで、[テーブル] を選択します。
- リソースリンクを選択し、[アクション] を選択します。
- ドロップダウンメニューで [付与] を選択します。
- [プリンシパル] で [IAM ユーザーとロール] を選択します。
- [IAM ユーザーとロール] で、アクセスを付与する IAM ユーザーまたはプリンシパルを選択します。
- [LF タグまたはカタログリソース] で、カタログ、データベース、テーブルを選択します。
- [リソースリンクのアクセス許可] と [付与可能なアクセス許可] で [説明] を選択します。
- [付与] を選択します。
ターゲットテーブルにアクセス許可を付与するには、上記の手順を繰り返します。ステップ 4 では [ターゲットに付与] を選択し、ステップ 8 では [選択] を選択します。
関連情報
Athena DynamoDB コネクタの「列が見つかりません」エラーを解決する方法を教えてください