当我在 Amazon Athena 中查询表时,如何解决 "GENERIC_INTERNAL_ERROR" 错误?

上次更新日期:2021 年 5 月 19 日

当我查询我的 Amazon Athena 表时,我收到 "GENERIC_INTERNAL_ERROR" 错误。

简短描述

GENERIC_INTERNAL_ERROR 异常的不同类型及其原因如下:

  • GENERIC_INTERNAL_ERROR:空值:在以下任一情况下,您可能会看到此异常:
    • 表定义中列的数据类型与数据集的实际数据类型之间存在架构不匹配。
    • 您运行的是语法不准确的 CREATE TABLE AS SELECT (CTAS) 查询。
  • GENERIC_INTERNAL_ERROR:父生成器为空:当您查询的表格包含数组数据类型列和 SerDe 格式 OpenCSVSerDe 时,您可能会看到此异常。OpenCSVSerde 格式不支持数组数据类型。
  • GENERIC_INTERNAL_ERROR:值超过 MAX_INT:当使用数据类型 INT 定义源数据列并且数值大于 2,147,483,647 时,您可能会看到此异常。
  • GENERIC_INTERNAL_ERROR:值超过 MAX_BYTE:当源数据列的数值超过数据类型 BYTE 的允许大小时,您可能会看到此异常。数据类型 BYTE 相当于 TINYINT。TINYINT 是一个二进制补码格式的 8 位带符号整数,最小值为 -128,最大值为 127。
  • GENERIC_INTERNAL_ERROR:分区数量值与筛选器数量不符:如果 Amazon Simple Storage Service (Amazon S3) 数据的分区不一致,您可能会看到此异常。在以下任一情况下,分区可能不一致:
    • Amazon S3 上的分区已更改(例如:添加了新分区)。
    • 表中的分区列数与分区元数据中的分区列数不匹配。

解决方法

GENERIC_INTERNAL_ERROR:空值

列数据类型不匹配:确保表定义中的列数据类型与源数据中的列数据类型兼容。Athena 使用读时模式技术。这意味着在处理查询时,表定义将应用于 Amazon S3 中的数据。例如,如果在 Parquet 文件上创建了表,Athena 会从这些文件中读取架构,并在查询 Parquet 文件时根据表定义验证架构。如果列的底层数据类型与表定义过程中提到的数据类型不匹配,则会收到此错误。

要解决此问题,请确认源数据文件是否损坏。如果源数据文件和表定义之间存在架构不匹配,请执行以下任一操作:

  • 使用 AWS Glue 数据目录更新架构。
  • 使用更新后的表定义创建新表

如果源数据文件损坏,请删除这些文件,然后查询表。

语法不准确:当出现以下两种情况时,您可能会收到 "GENERIC INTERNAL ERROR:null" 错误:

为避免此错误,在使用 CTAS 查询时,必须对 partitioned_bybucketed_by 属性使用不同的列名。要解决此错误,通过为 partitioned_bybucketed_by 属性选择不同的列名来创建新表

GENERIC_INTERNAL_ERROR:父生成器为空

要解决此错误,请查找具有数组数据类型的列,然后将此列的数据类型更改为字符串。要将列数据类型更改为字符串,请执行以下任一操作:

  • 更新数据目录中的架构。
  • 通过将列数据类型选择为字符串创建新表

您可以运行 SHOW CREATE TABLE 命令生成创建表的查询。可以从此命令的输出中查看所有列的列数据类型。查找具有数组数据类型的列,然后将此列的数据类型更改为字符串

要使用数据目录更新表的架构,请执行以下操作:

  1. 打开 AWS Glue 控制台
  2. 在导航窗格中,选择 Tables(表)。
  3. 选择要更新的表。
  4. 选择 Actions(操作),然后选择 View details(查看详细信息)。
  5. 选择 Edit schema(编辑架构)。
  6. 滚动到具有数组数据类型的列,然后选择数组
  7. 对于 Column type(列类型),从下拉列表中选择 string(字符串)。
  8. 选择 Update(更新)。
  9. Edit schema(编辑架构)页面上,选择 Save(保存)。

GENERIC_INTERNAL_ERROR:值超过 MAX_INT

要解决此错误,请查找具有 int 数据类型的列,然后将此列的数据类型从 int 更改为 bigint。要更改列数据类型,请更新数据目录中的架构或使用已更新的架构创建新表

您可以运行 SHOW CREATE TABLE 命令生成创建表的查询。可以从此命令的输出中查看所有列的列数据类型。查找具有 int 数据类型的列,然后将此列的数据类型更改为 bigint

要使用数据目录更新表的架构,请执行以下操作:

  1. 打开 AWS Glue 控制台
  2. 在导航窗格中,选择 Tables(表)。
  3. 选择要更新的表。
  4. 选择 Actions(操作),然后选择 View details(查看详细信息)。
  5. 选择 Edit schema(编辑架构)。
  6. 滚动到具有 int 数据类型的列,然后选择 int
  7. 对于 Column type(列类型),从下拉列表中选择 bigint
  8. 选择 Update(更新)。
  9. Edit schema(编辑架构)页面上,选择 Save(保存)。

GENERIC_INTERNAL_ERROR:值超过 MAX_BYTE

要解决此错误,请查找具有 tinyint 数据类型的列。 然后,将此列的数据类型更改为 smallintintbigint。或者,您可以通过使用更新的架构创建新表来解决此错误。

您可以运行 SHOW CREATE TABLE 命令生成创建表的查询。可以从此命令的输出中查看所有列的列数据类型。查找具有 tinyint 数据类型的列,然后将此列的数据类型更改为 smallintbigintint

要使用数据目录更新表的架构,请执行以下操作:

  1. 打开 AWS Glue 控制台
  2. 在导航窗格中,选择 Tables(表)。
  3. 选择要更新的表。
  4. 选择 Actions(操作),然后选择 View details(查看详细信息)。
  5. 选择 Edit schema(编辑架构)。
  6. 滚动到具有 tinyint 数据类型的列,然后选择 tinyinit
  7. 对于 Column type(列类型),从下拉列表中选择 smallintbigintint
  8. 选择 Update(更新)。
  9. Edit schema(编辑架构)页面上,选择 Save(保存)。

GENERIC_INTERNAL_ERROR:分区数量值与筛选器数量不符

要解决此错误,请执行以下任一方法:

ALTER TABLE doc_example_table DROP PARTITION (date = '2014-05-14');
ALTER TABLE doc_example_table ADD PARTITION (date = '2016-05-14', country = 'IN');

这篇文章对您有帮助吗?


您是否需要账单或技术支持?