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

2 分钟阅读
0

当我对 Amazon Athena 表进行查询时,遇到了“HIVE_CURSOR_ERROR”异常。

解决方法

在以下一种情况下,您可能会遇到此异常:

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

常见的 HIVE_CURSOR_ERROR 异常

当您的 Amazon Simple Storage Service(Amazon S3)表位置中的这些对象存在问题时,您可能会遇到以下异常之一:

  • 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 S3 表位置添加了新的对象,请确保这些对象有效且未损坏。下载对象,然后使用您最喜欢的工具对其进行检查。例如,解压缩 GZIP 压缩对象,以检查压缩是否有效。

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

特定的 HIVE_CURSOR_ERROR 异常

HIVE_CURSOR_ERROR: Row is not a valid JSON Object

当表中的某一行不是有效的 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

当您的 Parquet 对象在 S3 路径中无效时,就会出现此错误。检查您的 Parquet 对象是否包含十进制数据类型。如果您使用了 Spark 写入包含十进制数据类型的 Parquet 对象,那么它们可能会与 Hive 不兼容。要检查这种情况,请从 Spark 作业中读取 Parquet 对象。

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

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

如果您对表定义使用了错误的 SerDe,就会出现此错误。例如,该表可能会使用 JSON SerDe,源数据包含 Parquet 对象。

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

从 AWS Config 读取文件时出现的 HIVE\ _CURSOR\ _ERROR 错误

HIVE_CURSOR_ERROR: java.io.IOException: Start of Object expected

当数据 JsonSerDe 无法获取 JSON 记录的起始对象时,就会出现此错误。运行查询时,数据与架构不匹配,或者文件已损坏。

要解决此错误,请使用其他 SerDe 而不是默认的 org.apache.hive.hcatalog.data.JsonSerDe(例如 org.openx.data.jsonserde.JsonSerDe)。然后,将表属性设置为 'ignore.malformed.json' = 'true'

有关更多信息,请参阅 JSON SerDe 库

HIVE_CURSOR_ERROR: java.io.IOException: Start token not found where expected。

当 Athena 表位置包含除 AWS Config 提供的文件以外的文件时,就会出现此错误。例如,当 Athena 查询 CSV 输出设置为与 JSON 格式的 AWS Config 文件同一位置时。

要解决此错误,请移动或删除非 AWS Config 生成的文件。对于 Athena 查询结果,输出文件存储在以下路径模式中:

QueryResultsLocationInS3/[QueryName|Unsaved/yyyy/mm/dd/]

HIVE_CURSOR_ERROR: Row is not a valid JSON Object - JSONException: Duplicate key

当 AWS Config 资源具有多个采用相同名称的标签,或者其中一部分标签采用大写而一部分标签采用小写时,就会出现此错误。

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

相关信息

在 Athena 中进行故障排除

AWS 官方
AWS 官方已更新 9 个月前