当我对 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 记录时,就会出现此错误。
要解决此问题,请执行以下操作:
- 添加属性 'ignore.malformed.json' = 'true' 来重新创建表。
- 运行命令查询新表,以识别类似于以下的记录格式错误的文件:
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 中进行故障排除