如何解決在 Amazon Athena 中查詢資料表時出現的「GENERIC_INTERNAL_ERROR」錯誤?
在查詢我的 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_by 和 bucketed_by 使用相同的欄。
若要避免此錯誤,當您使用 CTA 查詢時,必須對 partitioned_by 和 bucketed_by 屬性使用不同的欄名稱。若要解決此錯誤,請為 partitioned_by 和 bucketed_by 屬性選擇不同的欄名稱,以建立新資料表。
GENERIC_INTERNAL_ERROR:父構建器為 null
若要解決此錯誤,請找到資料類型為陣列的欄,然後將此欄的資料類型變更為字串。若要將欄資料類型變更為字串,請執行下列任一項操作:
- 更新資料目錄中的架構。
- 選擇欄資料類型為字串以建立新資料表。
執行 SHOW CREATE TABLE 命令,以產生建立資料表的查詢。然後從此命令的輸出中查看所有欄的欄資料類型。找到資料類型為陣列的欄,然後將此欄的資料類型變更為字串。
若要使用資料目錄更新表的架構,請執行以下操作:
- 開啟 AWS Glue 主控台。
- 在導覽窗格中,選擇資料表。
- 選取您要更新的表。
- 選擇動作,然後選擇檢視詳情。
- 選擇編輯架構。
- 捲動到資料類型為陣列的欄,然後選擇陣列。
- 對於欄類型,從下拉清單中選取字串。
- 選擇更新。
- 在編輯架構頁面上,選擇儲存。
GENERIC_INTERNAL_ERROR: 值超過 MAX_INT
若要解決此錯誤,請找到資料類型為 int 的欄,然後將此欄的資料類型從 int 變更為 bigint。若要變更欄資料類型,請更新資料目錄中的架構,或使用更新的架構建立新資料表。
執行 SHOW CREATE TABLE 命令,以產生建立資料表的查詢。然後從此命令的輸出中查看所有欄的欄資料類型。找到資料類型為 int 的欄,然後將此欄的資料類型變更為 bigint。
若要使用資料目錄更新表的架構,請執行以下操作:
- 開啟 AWS Glue 主控台。
- 在導覽窗格中,選擇資料表。
- 選取您要更新的表。
- 選擇動作,然後選擇檢視詳情。
- 選擇編輯架構。
- 捲動至資料類型為 int 的欄,然後選擇 int。
- 對於欄類型,從下拉清單中選取 bigint。
- 選擇更新。
- 在編輯架構頁面上,選擇儲存。
GENERIC_INTERNAL_ERROR: 值超過 MAX_BYTE
若要解決此錯誤,請找到資料類型為 tinyint 的欄。然後,將此欄的資料類型變更為 smallint、int 或 bigint。或者,您可以使用更新的架構建立新資料表來解決此錯誤。
執行 SHOW CREATE TABLE 命令,以產生建立資料表的查詢。然後從此命令的輸出中查看所有欄的欄資料類型。找到資料類型為 tinyint 的欄,然後將此欄的資料類型變更為 smallint、bigint 或 int。
若要使用資料目錄更新表的架構,請執行以下操作:
- 開啟 AWS Glue 主控台。
- 在導覽窗格中,選擇資料表。
- 選取您要更新的表。
- 選擇動作,然後選擇檢視詳情。
- 選擇編輯架構。
- 捲動至資料類型為 tinyint 的欄,然後選擇 tinyinit。
- 對於欄類型,請從下拉清單中選取 smallint、bigint 或 int。
- 選擇更新。
- 在編輯架構頁面上,選擇儲存。
GENERIC_INTERNAL_ERROR: 分割區值的數量與篩選器數量不符
若要解決此錯誤,請執行以下任一動作:
- 使用 AWS Glue 爬蟲程式建立新資料表。
- 使用 ALTER TABLE DROP PARTITION 語句刪除分割區。然後,使用 ALTER TABLE ADD PARTITION 語句新增與資料表定義中相同數目的分割區。例如,假設資料表定義中日期和國家/地區兩個分割區欄,以及只有一個日期欄的分割區。刪除具有日期欄的分割區,然後將兩個分區新增至表中。
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'
相關資訊
相關內容
- 已提問 2 個月前lg...
- 已提問 2 個月前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 9 個月前
- AWS 官方已更新 4 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 10 個月前