跳至内容

如何解决 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. 在导航窗格中,选择 Data Catalog(数据目录),然后选择 Tables(表)。
  3. 选择表。
  4. 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-nametable-name 替换为数据库和表的名称。

将列添加到表的定义中

如果该列不存在于表的架构定义中,则使用 AWS Glue 控制台或 Athena 查询编辑器添加该列。

AWS Glue 控制台

完成以下步骤:

  1. 打开 AWS Glue 控制台
  2. 在导航窗格中,选择 Data Catalog(数据目录),然后选择 Tables(表)。
  3. 选择表,然后选择 Edit schema(编辑架构)。
  4. 选择 Add(添加),
  5. Add schema entry(添加架构条目)窗口中,向以下部分添加值:<br id=hardline_break/> 对于 Column #(列编号),输入要在其后插入新列的列编号。例如,如果您希望新列成为表架构中的第三列,则输入 2。<br id=hardline_break/> 对于 Name(名称),输入新列的名称。<br id=hardline_break/> 对于 Data type(数据类型),选择一种数据类型。
  6. 选择 Save(保存),然后选择 Save as new table version(另存为新表版本)。

Athena 查询编辑器

完成以下步骤:

  1. 打开 Athena 控制台
  2. 在导航窗格中,选择 Query editor(查询编辑器)。
  3. 运行以下 ALTER TABLE ADD COLUMNS DDL 语句:
    ALTER TABLE table-name ADD COLUMNS (column-name column-data-type)
    **注意:**请将 table-name 替换为您的表名。此外,请将 column-namecolumn-data-type 替换为新列所需的名称和数据类型。

授予 Lake Formation 在同一 AWS 账户中查询表或视图的权限

完成以下步骤:

  1. 以数据湖管理员身份打开 Lake Formation 控制台
  2. 在导航窗格中,选择 Tables(表)或 Views(视图)。
  3. 选择表或视图,然后选择 Actions(操作)。
  4. 在下拉菜单中,选择 Grant(授予)。
  5. Principals(主体)下,选择 IAM users and roles(IAM 用户和角色)。
  6. 对于 IAM users and roles(IAM 用户和角色),选择您要授予访问权限的 AWS Identity and Access Management (IAM) 用户或主体。
  7. LF-Tags or catalog resources(LF 标签或目录资源)下,选择 Named Data Catalog resources(命名 Data Catalog 资源),然后选择目录、数据库以及表或视图。
  8. 对于 Table permissions(表权限)或 View permissions(视图权限)以及 Grantable permissions(可授予的权限),选择要授予的访问权限。<br id=hardline_break/> **注意:**必须选择 Select(选择)和 Describe(描述)才能查询表或视图。
  9. 选择 Grant(授予)。

注意:如果您使用数据筛选条件,请确保正确设置列级访问权限。如果您选择 Include columns(包括列),请确保包括您的列。如果您选择 Exclude columns(排除列),请不要排除您的列。

授予在其他账户中查询表的权限

首先,创建资源链接。然后,授予资源链接和目标表的权限。

要授予资源链接的权限,请完成以下步骤:

  1. 在目标账户中,以数据湖管理员身份打开 Lake Formation 控制台
  2. 在导航窗格中,选择 Tables(表)。
  3. 选择资源链接,然后选择 Actions(操作)。
  4. 在下拉菜单中,选择 Grant(授予)。
  5. Principals(主体)下,选择 IAM users and roles(IAM 用户和角色)。
  6. 对于 IAM users and roles(IAM 用户和角色),选择您要授予访问权限的 IAM 用户或主体。
  7. LF-Tags or catalog resources(LF 标签或目录资源)下,选择目录、数据库和表。
  8. 对于 Resource link permissions(资源链接权限)和 Grantable permissions(可授予的权限),请选择 Describe(描述)。
  9. 选择 Grant(授予)。

要在目标表上授予权限,请重复上述步骤。在步骤 4 中选择 Grant on target(在目标上授权),然后在步骤 8 中选择 Select(选择)。

相关信息

如何解决 Athena DynamoDB 连接器出现的 "Column not found" 错误?

AWS 官方已更新 5 个月前