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

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 とデータ形式を参照してください。

AWS Config から読み込まれたファイルに関する HIVE\ _CURSOR\ _ERROR エラー

HIVE_CURSOR_ERROR: java.io.IOException: オブジェクトの開始が予想されます

このエラーは、データ JSONSerDe が JSON レコードの開始オブジェクトを取得できない場合に発生します。クエリを実行すると、データがスキーマと一致しないか、ファイルが破損します。

このエラーを解決するには、デフォルトの org.apache.hive.hcatalog.data.JsonSerDe の代わりに、 org.openx.data.jsonserde.JsonSerDe などの別の SerDe を使用します。次に、テーブルプロパティを 'ignore.malformed.json' = 'true' に設定します。

詳細については、JSON SerDe ライブラリを参照してください。

HIVE_CURSOR_ERROR: java.io.IOException: 開始トークンが期待どおりに見つかりませんでした。

このエラーは、Athena テーブルの場所に AWS Config によって配信されたファイル以外のファイルが含まれている場合に発生します。例えば、Athena クエリの CSV 出力が JSON 形式の AWS Config ファイルと同じ場所に設定されている場合です。

このエラーを解決するには、AWS Config で生成されていないファイルを移動または削除します。Athena クエリ結果の場合、出力ファイルは次のパスパターンで保存されます。

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

HIVE_CURSOR_ERROR: 行が有効な JSON オブジェクトではありません - JSONException: キーが重複しています

このエラーは、AWS Config リソースに同じ名前のタグが複数ある場合、または一部が大文字で一部が小文字の場合に発生します。

このエラーを解決するには、Athena で AWS Config からファイルを読み取るときの「HIVE_CURSOR_ERROR: 行が有効な JSON オブジェクトではありません - JSONException: キーが重複しています」を解決する方法を教えてください。を参照してください。

関連情報

Athena でのトラブルシューティング

AWS公式
AWS公式更新しました 1年前