跳至內容

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

3 分的閱讀內容
0

當我查詢 Amazon Athena 資料表時,我收到 "GENERIC_INTERNAL_ERROR" 錯誤。

解決方法

"GENERIC_INTERNAL_ERROR: null"

欄資料類型不相符

請確定資料表定義中的欄資料類型與來源資料中的欄資料類型相容。Athena 使用讀取模式技術。當 Athena 處理查詢時,它會將您的資料表定義套用至 Amazon Simple Storage Service (Amazon S3) 中的資料。

例如,當您在 Apache Parquet 檔案中建立資料表時,Athena 會從該檔案讀取架構。然後,Athena 會根據您查詢 Parquet 的資料表定義驗證架構。如果欄的資料類型與資料表定義的資料類型不相符,那麼您會收到 "Column data type mismatch" 錯誤。

如果來源資料檔案和資料表定義之間存在架構不相符,請執行下列其中一個動作:

另外,檢查來源資料檔案是否損壞。如果發現損壞的來源資料檔案,則刪除該檔案並查詢資料表。

語法不準確

當以下兩個條件都成立時,您可能會收到 "GENERIC INTERNAL ERROR: null" 錯誤:

使用 CTAS 查詢時,必須對 partitioned_bybucketed_by 屬性使用不同的欄名稱。若要解決此問題,請建立一個新資料表,並為 partitioned_bybucketed_by 選擇不同的欄名稱。

"GENERIC_INTERNAL_ERROR: parent builder is null"

當您查詢具有 array 欄且使用 OpenCSVSerde 格式的資料表時,就可能會發生此錯誤。OpenCSVSerde 格式不支援 array 資料類型。

若要解決此問題,請將資料類型為 array 的欄變更為 string。您可以使用 AWS Glue 主控台,也可以執行命令來修改欄的資料類型。或者,建立一個新資料表。

修改欄的資料類型

若要使用 AWS Glue 主控台,請完成以下步驟:

  1. 開啟 AWS Glue console (AWS Glue 主控台)。
  2. 在導覽窗格中,選擇資料表
  3. 選取您要更新的表。
  4. 選擇動作,然後選擇檢視詳情
  5. 選擇 Edit schema (編輯架構)。
  6. 找出資料類型為 array 的欄,然後選擇 array
  7. Column type (欄類型),於下拉式清單中選取 string
  8. 選擇 Update (更新)。
  9. Edit schema (編輯架構) 頁面上,選擇 Save (儲存)。

-或-

執行 SHOW CREATE TABLE 命令來產生建立該資料表的查詢。找到資料類型為 array 的欄,然後將資料類型變更為 string

建立新資料表

建立新資料表,然後選擇 string 作為欄資料類型。

"GENERIC_INTERNAL_ERROR: Value exceeds MAX_INT"

當來源 INT 欄中儲存格的數值大於 2,147,483,647 時,就可能會出現此錯誤。

若要解決此問題,請將資料類型為 int 的欄變更為 bigint。您可以使用 AWS Glue 主控台,也可以執行命令來修改欄的資料類型。或者,建立一個新資料表。

修改欄的資料類型

若要使用 AWS Glue 主控台,請完成以下步驟:

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

-或-

執行 SHOW CREATE TABLE 命令來產生建立該資料表的查詢。找到資料類型為 int 的欄,然後將資料類型變更為 bigint

建立新資料表

建立新資料表,然後選擇 bigint 作為欄資料類型。

"GENERIC_INTERNAL_ERROR: Value exceeds MAX_BYTE"

當來源 TINYINT 欄中的儲存格具有無效的數值時,您可能會收到此錯誤。TINYINT 欄的最小值為 -128,最大值為 127。

若要解決此問題,請將資料類型為 tinyint 的欄變更為 smallintintbigint。您可以使用 AWS Glue 主控台,也可以執行命令來修改欄的資料類型。或者,建立一個新資料表。

修改欄的資料類型

若要使用 AWS Glue 主控台,請完成以下步驟:

  1. 開啟 AWS Glue console (AWS Glue 主控台)。
  2. 在導覽窗格中,選擇資料表
  3. 選取您要更新的表。
  4. 選擇動作,然後選擇檢視詳情
  5. 選擇 Edit schema (編輯架構)。
  6. 找到資料類型為 tinyint 的欄,然後選擇 tinyinit
  7. Column type (欄類型),於下拉式清單中選取 smallintbigintint
  8. 選擇 Update (更新)。
  9. Edit schema (編輯架構) 頁面上,選擇 Save (儲存)。

-或-

執行 SHOW CREATE TABLE 命令來產生建立該資料表的查詢。找到資料類型為 tinyint 的欄,然後將資料類型變更為 smallintbigintint

建立新資料表

建立新資料表,然後選擇 smallintbigintint 作為欄資料類型。

"GENERIC_INTERNAL_ERROR: Number of partition values does not match number of filters"

當 Amazon S3 資料分區因下列原因而不一致時,您就可能會收到此錯誤:

  • 您變更了 S3 分區。例如,您新增了新的分區。
  • 資料表中的分區欄數與分區中繼資料中的分區欄數不符。

若要解決此問題,您可以設定 AWS Glue 編目程式來建立新資料表。或者,使用 ALTER TABLE DROP PARTITION 陳述式刪除分區。然後,使用 ALTER TABLE ADD PARTITION 陳述式新增與資料表定義中相同數量的分區。

例如,在資料表定義中有兩個分區欄,分別為 datecountry,還有一個分區只包含一個名為 date 的欄。刪除包含 date 欄的分區,然後將 datecountry 分區新增至資料表中。

命令範例:

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: Multiple entries with same key"

如果您有相同名稱的欄,那麼您必須預先處理資料,以包含有效的鍵值對。若要忽略相同名稱的欄,請在 org.openx.data.jsonserde.JsonSerDe 中將 ignore.malformed.json 設定為 SERDEPROPERTIES

Apache Hive 不支援區分大小寫的欄。例如,當您有兩欄,分別命名為 Columncolumn 時,就可能會出現問題。

如果欄名稱相同但大小寫不同,則必須使用對映射,並將 JSON 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 中的資料類型

對資料進行分區

AWS 官方已更新 7 個月前