我想解决在运行 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 控制台。
- 在导航窗格中,选择 Data Catalog(数据目录),然后选择 Tables(表)。
- 选择表。
- 在 Schema(架构)下,查看架构以确认该表存在。
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 控制台。
- 在导航窗格中,选择 Data Catalog(数据目录),然后选择 Tables(表)。
- 选择表,然后选择 Edit schema(编辑架构)。
- 选择 Add(添加),
- 在 Add schema entry(添加架构条目)窗口中,向以下部分添加值:<br id=hardline_break/>
对于 Column #(列编号),输入要在其后插入新列的列编号。例如,如果您希望新列成为表架构中的第三列,则输入 2。<br id=hardline_break/>
对于 Name(名称),输入新列的名称。<br id=hardline_break/>
对于 Data type(数据类型),选择一种数据类型。
- 选择 Save(保存),然后选择 Save as new table version(另存为新表版本)。
Athena 查询编辑器
完成以下步骤:
- 打开 Athena 控制台。
- 在导航窗格中,选择 Query editor(查询编辑器)。
- 运行以下 ALTER TABLE ADD COLUMNS DDL 语句:
ALTER TABLE table-name ADD COLUMNS (column-name column-data-type)
**注意:**请将 table-name 替换为您的表名。此外,请将 column-name 和 column-data-type 替换为新列所需的名称和数据类型。
授予 Lake Formation 在同一 AWS 账户中查询表或视图的权限
完成以下步骤:
- 以数据湖管理员身份打开 Lake Formation 控制台。
- 在导航窗格中,选择 Tables(表)或 Views(视图)。
- 选择表或视图,然后选择 Actions(操作)。
- 在下拉菜单中,选择 Grant(授予)。
- 在 Principals(主体)下,选择 IAM users and roles(IAM 用户和角色)。
- 对于 IAM users and roles(IAM 用户和角色),选择您要授予访问权限的 AWS Identity and Access Management (IAM) 用户或主体。
- 在 LF-Tags or catalog resources(LF 标签或目录资源)下,选择 Named Data Catalog resources(命名 Data Catalog 资源),然后选择目录、数据库以及表或视图。
- 对于 Table permissions(表权限)或 View permissions(视图权限)以及 Grantable permissions(可授予的权限),选择要授予的访问权限。<br id=hardline_break/>
**注意:**必须选择 Select(选择)和 Describe(描述)才能查询表或视图。
- 选择 Grant(授予)。
注意:如果您使用数据筛选条件,请确保正确设置列级访问权限。如果您选择 Include columns(包括列),请确保包括您的列。如果您选择 Exclude columns(排除列),请不要排除您的列。
授予在其他账户中查询表的权限
首先,创建资源链接。然后,授予资源链接和目标表的权限。
要授予资源链接的权限,请完成以下步骤:
- 在目标账户中,以数据湖管理员身份打开 Lake Formation 控制台。
- 在导航窗格中,选择 Tables(表)。
- 选择资源链接,然后选择 Actions(操作)。
- 在下拉菜单中,选择 Grant(授予)。
- 在 Principals(主体)下,选择 IAM users and roles(IAM 用户和角色)。
- 对于 IAM users and roles(IAM 用户和角色),选择您要授予访问权限的 IAM 用户或主体。
- 在 LF-Tags or catalog resources(LF 标签或目录资源)下,选择目录、数据库和表。
- 对于 Resource link permissions(资源链接权限)和 Grantable permissions(可授予的权限),请选择 Describe(描述)。
- 选择 Grant(授予)。
要在目标表上授予权限,请重复上述步骤。在步骤 4 中选择 Grant on target(在目标上授权),然后在步骤 8 中选择 Select(选择)。
相关信息
如何解决 Athena DynamoDB 连接器出现的 "Column not found" 错误?