跳至內容

如何解決在 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 資料類型。如果您使用 Spark 來編寫包含 DECIMAL 資料類型的 Parquet 物件,則它們可能與 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 記錄的開始物件時,您會收到此錯誤。執行查詢時,資料與結構描述不相符,或者檔案已損毀。

若要解決此錯誤,請使用不同的 SerDe,而不是預設的 org.apache.hive.hcatalog.data.JsonSerDe,例如 org.openx.data.jsonserde.JsonSerDe。然後,將表格屬性設定為 '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 資源有多個具有相同名稱的標籤,或某些標籤為大寫,而有些標籤為小寫時,您會收到此錯誤。

若要解決此錯誤,請參閱如何解決「HIVE_CURSOR_ERROR: 資料列不是有效的 JSON 物件 - JSONException: 重複的索引鍵」,當從 Athena 中的 AWS Config 讀取檔案時?

相關資訊

Athena 疑難排解

AWS 官方已更新 2 年前