跳至内容

如何解决在查询 Athena 中的表时出现的"GENERIC_INTERNAL_ERROR"错误?

3 分钟阅读
0

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

解决方法

"GENERIC_INTERNAL_ERROR: null"

列数据类型不匹配

确保表定义中的列数据类型与源数据中的列数据类型兼容。Athena 采用 schema-on-read 技术。当 Athena 处理查询时,它会将您的表定义应用于您存储在 Amazon Simple Storage Service (Amazon S3) 中的数据。

例如,当您基于 Apache Parquet 文件创建表时,Athena 会从该文件中读取架构。然后,Athena 会根据您查询 Parquet 时使用的表定义来验证该架构。如果列数据类型与表定义的数据类型不匹配,您将会收到"Column data type mismatch"错误。

如果源数据文件与表定义之间存在架构不匹配,请执行以下操作之一:

此外,请检查源数据文件是否损坏。如果发现损坏的源数据文件,请删除这些文件并查询表。

语法不准确

当以下两个条件同时成立时,您可能会收到"GENERIC INTERNAL ERROR: null"错误:

使用 CTAS 查询时,必须对 partitioned_bybucketed_by 属性使用不同的列名称。要解决此问题,请创建一个新表,然后为 partitioned_bybucketed_by 选择不同的列名称。

"GENERIC_INTERNAL_ERROR: parent builder is null"

当您查询包含 array 列且采用 OpenCSVSerde 格式的表时,可能会收到此错误。OpenCSVSerde 格式不支持 array 数据类型。

要解决此问题,请将数据类型为 array 的列更改为 string。您可以使用 AWS Glue 控制台,或通过运行命令来修改列的数据类型。或者,创建新表。

修改列的数据类型

要使用 AWS Glue 控制台,请完成以下步骤:

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

-或-

运行 SHOW CREATE TABLE 命令,以生成创建了该表的查询。找到数据类型为 array 的列,然后将数据类型更改为 string

创建新表

创建一个新表,然后为列数据类型选择 string

"GENERIC_INTERNAL_ERROR: Value exceeds MAX_INT"

当源 INT 列中某个单元格的数值大于 2,147,483,647 时,您可能会收到此错误。

要解决此问题,请将数据类型为 int 的列更改为 bigint。您可以使用 AWS Glue 控制台,或通过运行命令来修改列的数据类型。或者,创建新表。

修改列的数据类型

要使用 AWS Glue 控制台,请完成以下步骤:

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

-或-

运行 SHOW CREATE TABLE 命令,以生成创建了该表的查询。找到数据类型为 int 的列,然后将数据类型更改为 bigint

创建新表

创建一个新表,然后为列数据类型选择 bigint

"GENERIC_INTERNAL_ERROR: Value exceeds MAX_BYTE"

当源 TINYINT 列中某个单元格的数值无效时,您可能会收到此错误。TINYINT 列的最小值为 -128,最大值为 127。

要解决此问题,请将数据类型为 tinyint 的列更改为 smallintintbigint。您可以使用 AWS Glue 控制台,或通过运行命令来修改列的数据类型。或者,创建新表。

修改列的数据类型

要使用 AWS Glue 控制台,请完成以下步骤:

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

-或-

运行 SHOW CREATE TABLE 命令,以生成创建了该表的查询。找到数据类型为 tinyint 的列,然后将数据类型更改为 smallintbigintint

创建新表

创建一个新表,然后为列数据类型选择 smallintbigintint

"GENERIC_INTERNAL_ERROR: Number of partition values does not match number of filters"

当由于以下原因之一导致 Amazon S3 数据分区出现不一致时,您可能会收到此错误:

  • 您更改了 S3 分区。例如,您添加了新分区。
  • 表中的分区列数量与分区元数据中的分区列数量不匹配。

要解决此问题,您可以配置 AWS Glue 爬网程序以创建新表。或者,使用 ALTER TABLE DROP PARTITION 语句删除分区。然后,使用 ALTER TABLE ADD PARTITION 语句添加与表定义中相同数量的分区。

例如,表定义中包含名为 datecountry 的分区列,而某个分区中仅存在名为 date 的单列。删除包含 date 列的分区,然后在表中添加 datecountry 分区。

命令示例:

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: Multiple entries with same key"

如果存在同名列,则必须预先处理数据,以包含有效的键值对。要忽略同名列,请在 org.openx.data.jsonserde.JsonSerDe 中将 ignore.malformed.json 设置为 SERDEPROPERTIES

Apache Hive 不支持区分大小写的列。例如,当存在名为 Columncolumn 的两列时,您可能会遇到问题。

如果列名称相同但大小写不同,则必须使用映射并将 JSON 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 中的数据类型

对您的数据进行分区

AWS 官方已更新 7 个月前