為什麼我的 Amazon Athena 查詢失敗,並顯示如下錯誤:「HIVE_BAD_DATA: 解析欄位 X 的欄位值時發生錯誤: 對於輸入字串: "12312845691"」?

4 分的閱讀內容
0

當我在 Amazon Athena 中查詢資料時,出現類似下列其中一項的錯誤: 「HIVE_BAD_DATA: 解析欄位 X 的欄位值時發生錯誤: 對於輸入字串: “12312845691”「HIVE_BAD_DATA: 剖析欄位 '0' 時發生錯誤:目標比例必須大於來源比例」

簡短說明

HIVE_BAD_DATA 錯誤有多個版本。如果錯誤訊息指定了空值或空白的輸入字串 (例如,「針對輸入字串:"""),請參閱為什麼會出現錯誤「HIVE\ _BAD\ _DATA: 解析欄位 X 的欄位值 " 時發生錯誤: 對於輸入字串:""" 當我在 Amazon Athena 中查詢 CSV 資料時?

如果錯誤訊息有為輸入字串指定一個值,則發生下列其中一種情況:

  • 資料表定義中定義的資料類型與實際來源資料不符。
  • 單一欄位包含不同類型的資料 (例如:一筆記錄的整數值和另一筆記錄的小數值)。

解決方法

最佳實務是在一個欄位中只使用一種資料類型。否則查詢可能會失敗。若要解決錯誤,請確定每個欄位都包含相同資料類型的值,且值在允許的範圍內。

如果仍然出現錯誤,請將欄位的資料類型變更為具有較高範圍的相容資料類型。如果變更資料類型無法解決問題,請嘗試下列範例中的解決方案。

範例 1

  • 來源格式: JSON
  • **問題:**在最後一筆記錄中,"id" 索引鍵值是 "0.54",此為 DECIMAL 資料類型。但是,其他記錄中的 "id" 索引鍵值設定為 INT。

來源資料:

{ "id" : 50, "name":"John" }
{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }
{ "id" : 0.54, "name":"Jill" }

資料定義語言 (DDL) 陳述式:

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data (
    id INT,
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data/';

資料操作語言 (DML) 陳述式:

SELECT *
FROM jsontest_error_hive_bad_data

錯誤:

Your query has the following error(s):
HIVE_BAD_DATA: Error parsing field value '0.54' for field 0: For input string: "0.54"
This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: bd50793b-94fc-42a7-b131-b7c81da273b2.

若要解決此問題,請將 "id" 欄位重新定義為 STRING。STRING 資料類型可正確地表示此資料集中的所有值。範例:

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_correct_id_data_type (
    id STRING,
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data/';

DML 陳述式:

SELECT *
FROM jsontest_error_hive_bad_data_correct_id_data_type

您也可以使用 CAST 轉換所需的資料類型。例如,您可以將字串轉換為整數。但是,根據您要從中轉換和轉換到的資料類型,這可能會傳回 null 或不正確的結果。無法轉換的值會被捨棄。例如,將字串值 "0.54" 轉換為 INT 會傳回 null 結果:

SELECT TRY_CAST(id AS INTEGER)
FROM jsontest_error_hive_bad_data_correct_id_data_type

範例輸出:

Results
     _col0
1    50
2    51
3    53
4

輸出顯示值 "0.54" 已被捨棄。您不能直接將該值從字串轉換為整數。若要解決此問題,請使用 COALESCE 在與輸出相同的欄位中透過 CAST 轉換混合類型值。然後,允許在欄位上執行彙總函數。範例:

SELECT COALESCE(TRY_CAST(id AS INTEGER), TRY_CAST(id AS DECIMAL(10,2)))
FROM jsontest_error_hive_bad_data_correct_id_data_type

輸出:

Results
     _col0
1    50.00
2    51.00
3    53.00
4    0.54

執行彙總函數:

SELECT SUM(COALESCE(TRY_CAST(id AS INTEGER), TRY_CAST(id AS DECIMAL(10,2))))
FROM jsontest_error_hive_bad_data_correct_id_data_type

輸出:

_col0
1    154.54

範例 2

  • 來源格式: JSON
  • 問題:"id" 欄位被定義為 INT。因為 Presto 中的 INT 值範圍是 -2147483648 到 2147483647,因此 Athena 無法解析 "49612833315"。

來源資料:

{ "id" : 50, "name":"John" }
{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }
{ "id" : 49612833315, "name":"Jill" }

DDL 陳述式:

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_2 (
    id INT,
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_2/';

DML 陳述式:

SELECT *
FROM jsontest_error_hive_bad_data_sample_2

錯誤:

Your query has the following error(s):
HIVE_BAD_DATA: Error parsing field value '49612833315' for field 0: For input string: "49612833315"
This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: 05b55fb3-481a-4012-8c0d-c27ef1ee746f.

若要解決此問題,請將 "id" 欄位定義為 BIGINT,它可以讀取值 "49612833315"。 如需詳細資訊,請參閱整數類型

修改後的 DDL 陳述式:

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_2_corrected (
    id BIGINT,
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_2/';

範例 3

  • 來源格式: JSON
  • **問題:**輸入資料是 DECIMAL,欄位在資料表定義中定義為 DECIMAL。但是,比例定義為 2,與 "0.000054" 的值不符。如需詳細資訊,請參閱 DECIMAL 或 NUMERIC 類型

來源資料:

{ "id" : 0.50, "name":"John" }
{ "id" : 0.51, "name":"Jane" }
{ "id" : 0.53, "name":"Jill" }
{ "id" : 0.000054, "name":"Jill" }

DDL 陳述式:

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_3(
    id DECIMAL(10,2),
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_3/';

DML 陳述式:

SELECT *
FROM jsontest_error_hive_bad_data_sample_3

錯誤:

Your query has the following error(s):
HIVE_BAD_DATA: Error parsing column '0': target scale must be larger than source scale
This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: 1c3c7278-7012-48bb-8642-983852aff999.

若要解決此問題,請使用擷取所有輸入值的比例來重新定義欄位。例如,使用 (10,7) 而不是 (10,2)。

CREATE EXTERNAL TABLE jsontest_error_hive_bad_data_sample_3_corrected(
    id DECIMAL(10,7),
    name STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://awsexamplebucket/jsontest_error_hive_bad_data_3/';

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