如何解決在 Amazon Athena 中查詢資料表時出現的「GENERIC_INTERNAL_ERROR」錯誤?

2 分的閱讀內容
0

在查詢我的 Amazon Athena 表時,收到錯誤「GENERIC_INTERNAL_ERROR」。

簡短描述

不同類型的 GENERIC_INTERNAL_ERROR 例外及其原因如下:

  • GENERIC_INTERNAL_ERROR: null: 在下列任一情況下,您都可能會看到此例外狀況:
  • 資料表定義中資料行的資料類型與資料集的實際資料類型之間,架構不相符。
  • 您在使用不正確的語法執行 CREATE TABLE AS SELECT (CTAS) 查詢。
  • GENERIC_INTERNAL_ERROR:父構建器為 null:當您查詢包含資料類型陣列的欄的資料表以及 Serde 格式 OpenCSVSerDe 時,可能會看到這個例外狀況。OpenCSVSerde 格式不支援陣列資料類型。
  • **GENERIC_INTERNAL_ERROR: 值超過 MAX_INT:**當來源資料欄是以 INT 資料類型定義且數值大於 2,147,483,647 時,您可能會看到這個例外狀況。
  • **GENERIC_INTERNAL_ERROR: 值超過 MAX_BYTE:**當來源資料欄的數值超過資料類型 BYTE 允許的大小時,您可能會看到這個例外狀況。資料類型 BYTE 相當於 TINYINT。TINYINT 是一個 8 位有符號 INTEGER,採用二進位補碼格式,最小值為 -128,最大值為 127。
  • **GENERIC_INTERNAL_ERROR: 分割區值的數量與篩選器數量不符:**如果 Amazon Simple Storage Service (Amazon S3) 資料上的分割區不一致,可能會看到此例外狀況。在下列任一情況下,可能會有不一致的分割區:
  • Amazon S3 上的分割區已變更 (例如:新增了分割區)。
  • 資料表中的分割區資料欄數與分割區中繼資料中的資料欄數不符。
  • **GENERIC_INTERNAL_ERROR: 具有相同索引鍵的多個項目:**您可能會因為 JSON 資料中的索引鍵 (欄) 而看到此例外狀況:
  • 相同的名稱使用了兩次。
  • 轉換為全部小寫時,使用了相同的名稱。

解決方法

GENERIC_INTERNAL_ERROR:null

**欄資料類型不相符:**請確定資料表定義中的欄資料類型與來源資料中的欄資料類型相容。Athena 使用讀時模式技術。這表示您的資料表定義會在處理查詢時套用至 Amazon S3 中的資料。

例如,在 Parquet 檔案上建立資料表時:

  • Athena 從檔案中讀取架構
  • 然後,Athena 會根據在其中查詢 Parquet 檔案的資料表定義來驗證架構。

如果欄的基礎資料類型與資料表定義期間提到的資料類型不相符,則會顯示欄資料類型不符錯誤。

若要解決此問題,請確認來源資料檔案未損毀。如果來源資料檔案和資料表定義之間存在架構不相符,請執行下列任一項操作:

  • 使用 AWS Glue Data Catalog 更新架構。
  • 使用更新的資料表定義建立新資料表

如果來源資料檔案損毀,請刪除檔案,然後查詢資料表。

**語法不準確:**當下列兩個條件成立時,您可能會收到「GENERIC INTERNAL ERROR:null」錯誤:

若要避免此錯誤,當您使用 CTA 查詢時,必須對 partitioned_bybucketed_by 屬性使用不同的欄名稱。若要解決此錯誤,請為 partitioned_bybucketed_by 屬性選擇不同的欄名稱,以建立新資料表

GENERIC_INTERNAL_ERROR:父構建器為 null

若要解決此錯誤,請找到資料類型為陣列的欄,然後將此欄的資料類型變更為字串。若要將欄資料類型變更為字串,請執行下列任一項操作:

  • 更新資料目錄中的架構。
  • 選擇欄資料類型為字串建立新資料表

執行 SHOW CREATE TABLE 命令,以產生建立資料表的查詢。然後從此命令的輸出中查看所有欄的欄資料類型。找到資料類型為陣列的欄,然後將此欄的資料類型變更為字串

若要使用資料目錄更新表的架構,請執行以下操作:

  1. 開啟 AWS Glue 主控台
  2. 在導覽窗格中,選擇資料表
  3. 選取您要更新的表。
  4. 選擇動作,然後選擇檢視詳情
  5. 選擇編輯架構。
  6. 捲動到資料類型為陣列的欄,然後選擇陣列
  7. 對於欄類型,從下拉清單中選取字串
  8. 選擇更新
  9. 編輯架構頁面上,選擇儲存

GENERIC_INTERNAL_ERROR: 值超過 MAX_INT

若要解決此錯誤,請找到資料類型為 int 的欄,然後將此欄的資料類型從 int 變更為 bigint。若要變更欄資料類型,請更新資料目錄中的架構,或使用更新的架構建立新資料表

執行 SHOW CREATE TABLE 命令,以產生建立資料表的查詢。然後從此命令的輸出中查看所有欄的欄資料類型。找到資料類型為 int 的欄,然後將此欄的資料類型變更為 bigint

若要使用資料目錄更新表的架構,請執行以下操作:

  1. 開啟 AWS Glue 主控台
  2. 在導覽窗格中,選擇資料表
  3. 選取您要更新的表。
  4. 選擇動作,然後選擇檢視詳情
  5. 選擇編輯架構
  6. 捲動至資料類型為 int 的欄,然後選擇 int
  7. 對於欄類型,從下拉清單中選取 bigint
  8. 選擇更新
  9. 編輯架構頁面上,選擇儲存

GENERIC_INTERNAL_ERROR: 值超過 MAX_BYTE

若要解決此錯誤,請找到資料類型為 tinyint 的欄。然後,將此欄的資料類型變更為 smallintintbigint。或者,您可以使用更新的架構建立新資料表來解決此錯誤。

執行 SHOW CREATE TABLE 命令,以產生建立資料表的查詢。然後從此命令的輸出中查看所有欄的欄資料類型。找到資料類型為 tinyint 的欄,然後將此欄的資料類型變更為 smallintbigintint

若要使用資料目錄更新表的架構,請執行以下操作:

  1. 開啟 AWS Glue 主控台
  2. 在導覽窗格中,選擇資料表
  3. 選取您要更新的表。
  4. 選擇動作,然後選擇檢視詳情
  5. 選擇編輯架構
  6. 捲動至資料類型為 tinyint 的欄,然後選擇 tinyinit
  7. 對於欄類型,請從下拉清單中選取 smallintbigintint
  8. 選擇更新
  9. 編輯架構頁面上,選擇儲存

GENERIC_INTERNAL_ERROR: 分割區值的數量與篩選器數量不符

若要解決此錯誤,請執行以下任一動作:

ALTER TABLE doc_example_table DROP PARTITION (date = '2014-05-14');

ALTER TABLE doc_example_table ADD PARTITION (date = '2016-05-14', country = 'IN');

GENERIC_INTERNAL_ERROR: 具有相同索引鍵的多個項目

如果資料列具有使用相同索引鍵的多個欄,則需要預先處理資料,以包含有效的索引鍵值對。如果只有一些記錄具有重複的索引鍵,並且您想略過這些記錄,請在 org.openx.data.jsonserde.JsonSerDe 中將 ignore.malformed.json 設定為 SERDEPROPERTIES

如果索引鍵名稱相同但情況不同 (例如: “Column”、“column”),則必須使用對應。這是因為 hive 不支援區分大小寫的欄。為此,您必須設定 SerDe 忽略大小寫。

請執行下列動作:

CREATE TABLE mytable (  
  time1 string,
  time2 string)
 ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
"case.insensitive" = "false", --tells hive to ignore key case
"mapping.time1"= "time", -- lowercase 'time' mapped into 'time1'
"mapping.time2"= "Time") -- uppercase to 'time2'

相關資訊

Amazon Athena 中的資料類型

在 Athena 中分割資料

AWS 官方
AWS 官方已更新 1 年前