Amazon Athena のテーブルをクエリするときに表示される「HIVE_CURSOR_ERROR」例外を解決するにはどうすればよいですか?

最終更新日: 2021 年 5 月 14 日

Amazon Athena テーブルでクエリを実行すると、「HIVE_CURSOR_ERROR」例外が発生します。

解決方法

この例外は、次の条件のいずれかが満たされた場合に発生する可能性があります。

  • テーブルの場所にあるデータオブジェクトが壊れている、無効である、または正しく圧縮されていない
  • テーブルデータ内のレコードが有効ではない (例: 形式が正しくない JSON レコード)

一般的な HIVE_CURSOR_ERROR 例外

基になるオブジェクトに問題がある場合、次のいずれかの HIVE_CURSOR_ERROR 例外が発生することがあります。

  • HIVE_CURSOR_ERROR: ヘッダーチェックが正しくありません
  • HIVE_CURSOR_ERROR: ブロックタイプが無効です
  • HIVE_CURSOR_ERROR: データチェックが正しくありません
  • HIVE_CURSOR_ERROR: 入力ストリームが予期せず終了しました
  • HIVE_CURSOR_ERROR: 格納されたブロックの長さが無効です
  • HIVE_CURSOR_ERROR: 距離コードが無効です

Amazon Simple Storage Service (Amazon S3) テーブルの場所に最近新しいオブジェクトを追加した場合は、これらのオブジェクトが有効であり、破損していないことを確認してください。オブジェクトをダウンロードし、適切なツールを使用して検査します。例えば、GZIP 圧縮オブジェクトを解凍して、圧縮が有効かどうかをチェックします。

テーブルがパーティション化されている場合は、個々のパーティションをクエリできるかどうかを確認します。テーブルに新しいパーティションがある場合、それらのパーティションには無効なオブジェクトが含まれている可能性があります。

特殊な HIVE_CURSOR_ERROR 例外

HIVE_CURSOR_ERROR: 行は有効な 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: 圧縮されていないブロックが破損しています

このエラーは、テーブルの場所にあるオブジェクトが 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: ファイル内のブロック 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 を org.apache.hadoop.io.Text にキャストできません

このエラーは、テーブル定義中に不正な SerDe を使用した場合に発生します。例えば、テーブルで JSON SerDe を使用し、ソースデータに Parquet オブジェクトが含まれているとします。

このエラーを解決するには、ソースデータを確認し、正しい SerDe が使用されていることを確認します。詳細については、サポートされている SerDes とデータ形式を参照してください。