如何解决在查询 Amazon Athena 中的表时的“HIVE_CURSOR_ERROR”异常?

2 分钟阅读
0

当我在 Amazon Athena 表上运行查询时,我遇到了“HIVE_CURSOR_ERROR”异常。

解决方法

在下列情况下,您可能会遇到此异常:

  • 表位置中的数据对象已损坏、无效或压缩不正确。
  • 表数据中的记录无效(例如:JSON 记录格式错误)。

常见的 HIVE_CURSOR_ERROR 异常

如果底层对象出现问题,您可能会遇到以下 HIVE_CURSOR_ERROR 异常:

  • HIVE_CURSOR_ERROR: incorrect header check(标头校验错误)
  • HIVE_CURSOR_ERROR: invalid block type(块类型无效)
  • HIVE_CURSOR_ERROR: incorrect data check(数据校验错误)
  • HIVE_CURSOR_ERROR: Unexpected end of input stream(输入流意外结束)
  • HIVE_CURSOR_ERROR: invalid stored block lengths(存储块长度无效)
  • HIVE_CURSOR_ERROR: invalid distance code(距离代码无效)

如果您最近向 Amazon Simple Storage Service(Amazon S3)表位置添加了新对象,请确保这些对象有效且未损坏。下载对象,然后使用适当的工具进行检查。例如,解压缩 GZIP 压缩对象以检查压缩是否有效。

如果您的表已分区,请检查您是否能够查询每个分区。如果表中有新分区,它们可能包含无效的对象。

特定的 HIVE_CURSOR_ERROR 异常

HIVE_CURSOR_ERROR: Row is not a valid JSON Object(行不是有效的 JSON 对象)

如果表中的行不是有效的 JSON 记录,则会出现此错误。

要解决此问题,请执行以下操作:

  1. 通过添加属性 'ignore.malformed.json' = 'true' 来重新创建表。
  2. 通过运行与以下类似的命令查询新表,以识别记录格式有错误的文件:
SELECT "$path" FROM example_table WHERE example_column = NULL

有关更多信息,请参阅解决 Amazon Athena 中的 JSON 错误OpenX JSON SerDe 选项

HIVE_CURSOR_ERROR: Corrupted uncompressed block(未压缩的数据块损坏)

使用 LZO 格式压缩表位置中的对象时,会出现此错误。

为避免使用 LZO 压缩的数据出现此错误,请使用 INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat" 重新创建表。例如:

CREATE EXTERNAL TABLE example_table (
    example_column_1 STRING,
    example_column_2 STRING
)
STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://example_bucket/example_prefix/'

您还可以使用其他压缩格式来解决此错误。

HIVE_CURSOR_ERROR: Can not read value at 0 in block 0 in file(无法读取文件中块 0 中位置 0 的值)

如果 S3 路径中包含无效的 Parquet 对象,则会出现此错误。检查您的 Parquet 对象是否包含 DECIMAL 数据类型如果 Parquet 对象包含 DECIMAL 数据类型并且是使用 Spark 编写的,则它们可能与 Hive 不兼容。要检查这种情况,请尝试使用 Spark 作业中读取 Parquet 对象。

如果您可以使用 Spark 作业读取 Parquet 对象,则使用以下配置在 Spark 中使用旧版模式重写 Parquet 对象:

spark.sql.parquet.writeLegacyFormat = true

有关 Parquet 的 Spark 配置选项的信息,请参阅 Spark SQL 指南中的配置

HIVE_CURSOR_ERROR: org.apache.hadoop.io.ArrayWritable cannot be cast to org.apache.hadoop.io.Text(org.apache.hadoop.io.ArrayWritable 不能投射到 org.apache.hadoop.io.Text)

如果在表定义中使用了错误的 SerDe,则会出现此错误。例如,表格可能在使用 JSON SerDe,而源数据包含 Parquet 对象。

要解决此错误,请检查源数据并确认使用了正确的 SerDe。有关更多信息,请参阅支持的 SerDes 和数据格式


相关信息

如何解决在 Athena 中读取 AWS Config 中的文件时出现的“HIVE_CURSOR_ERROR: Row is not a valid JSON Object - JSONException: Duplicate key”错误?

排查 Athena 中的问题

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