当我查询我的 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_by 和 bucketed_by 属性使用不同的列名称。要解决此问题,请创建一个新表,然后为 partitioned_by 和 bucketed_by 选择不同的列名称。
"GENERIC_INTERNAL_ERROR: parent builder is null"
当您查询包含 array 列且采用 OpenCSVSerde 格式的表时,可能会收到此错误。OpenCSVSerde 格式不支持 array 数据类型。
要解决此问题,请将数据类型为 array 的列更改为 string。您可以使用 AWS Glue 控制台,或通过运行命令来修改列的数据类型。或者,创建新表。
修改列的数据类型
要使用 AWS Glue 控制台,请完成以下步骤:
- 打开 AWS Glue 控制台。
- 在导航窗格中,选择 Tables(表)。
- 选择要更新的表。
- 选择 Action(操作),然后选择 View details(查看详细信息)。
- 选择 Edit schema(编辑架构)。
- 找到数据类型为 array 的列,然后选择 array。
- 对于 Column type(列类型),在下拉列表中选择 string。
- 选择 Update(更新)。
- 在 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 控制台,请完成以下步骤:
- 打开 AWS Glue 控制台。
- 在导航窗格中,选择 Tables(表)。
- 选择要更新的表。
- 选择 Action(操作),然后选择 View details(查看详细信息)。
- 选择 Edit schema(编辑架构)。
- 找出数据类型为 int 的列,然后选择 int。
- 对于 Column type(列类型),在下拉列表中选择 bigint。
- 选择 Update(更新)。
- 在 Edit schema(编辑架构)页面上,选择 Save(保存)。
-或-
运行 SHOW CREATE TABLE 命令,以生成创建了该表的查询。找到数据类型为 int 的列,然后将数据类型更改为 bigint。
创建新表
创建一个新表,然后为列数据类型选择 bigint。
"GENERIC_INTERNAL_ERROR: Value exceeds MAX_BYTE"
当源 TINYINT 列中某个单元格的数值无效时,您可能会收到此错误。TINYINT 列的最小值为 -128,最大值为 127。
要解决此问题,请将数据类型为 tinyint 的列更改为 smallint、int 或 bigint。您可以使用 AWS Glue 控制台,或通过运行命令来修改列的数据类型。或者,创建新表。
修改列的数据类型
要使用 AWS Glue 控制台,请完成以下步骤:
- 打开 AWS Glue 控制台。
- 在导航窗格中,选择 Tables(表)。
- 选择要更新的表。
- 选择 Action(操作),然后选择 View details(查看详细信息)。
- 选择 Edit schema(编辑架构)。
- 找到数据类型为 tinyint 的列,然后选择 tinyinit。
- 对于 Column type(列类型),在下拉列表中选择 smallint、bigint 或 int。
- 选择 Update(更新)。
- 在 Edit schema(编辑架构)页面上,选择 Save(保存)。
-或-
运行 SHOW CREATE TABLE 命令,以生成创建了该表的查询。找到数据类型为 tinyint 的列,然后将数据类型更改为 smallint、bigint 或 int。
创建新表
创建一个新表,然后为列数据类型选择 smallint、bigint 或 int。
"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 语句添加与表定义中相同数量的分区。
例如,表定义中包含名为 date 和 country 的分区列,而某个分区中仅存在名为 date 的单列。删除包含 date 列的分区,然后在表中添加 date 和 country 分区。
命令示例:
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 不支持区分大小写的列。例如,当存在名为 Column 和 column 的两列时,您可能会遇到问题。
如果列名称相同但大小写不同,则必须使用映射并将 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 中的数据类型
对您的数据进行分区