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

2 分钟阅读
0

当我查询我的 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:多个条目具有相同的键:**在以下情况下,由于 JSON 数据中的键(列),您可能看到此异常:
  • 同一个名称使用了两次。
  • 当它转换为全部小写时,使用了相同的名称。

解决方法

GENERIC_INTERNAL_ERROR:空值

**列数据类型不匹配:**确保表定义中的列数据类型与源数据中的列数据类型兼容。Athena 使用读时模式技术。这意味着在处理查询时,表定义将应用于 Amazon S3 中的数据。

例如,在 Parquet 文件上创建表时:

  • Athena 从文件中读取架构
  • 然后,Athena 根据查询 Parquet 文件的表定义来验证架构。

如果列的底层数据类型与表定义过程中提到的数据类型不匹配,则会显示列数据类型不匹配错误。

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

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

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

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

为避免此错误,在使用 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');

GENERIC_INTERNAL_ERROR:多个条目具有相同的键

如果行中有多个列具有相同的键,则需要对数据进行预处理以包含有效的键值对。如果仅一些记录具有重复的键,并且您想要忽略这些记录,请在 org.openx.data.jsonserde.JsonSerDe 中将 ignore.malformed.json 设置为 SERDEPROPERTIES

如果键名称相同但大小写不同(例如:“列(Column)”、“列(column)”),则必须使用映射。这是因为 hive 不支持区分大小写的列。为此,必须将 SerDe 配置为忽略大小写。

执行以下操作:

CREATE TABLE mytable (  
  time1 string, 
  time2 string)
 ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
"case.insensitive" = "false", --tells hive to ignore key case
"mapping.time1"= "time", -- lowercase 'time' mapped into 'time1'
"mapping.time2"= "Time") -- uppercase to 'time2'

相关信息

Amazon Athena 中的数据类型

在 Athena 中对数据进行分区

AWS 官方
AWS 官方已更新 1 年前