"HIVE_BAD_DATA: 필드 X: 입력 문자열: "12312845691"에 대해 필드 값을 구문 분석하는 동안 오류 발생" 오류와 함께 Amazon Athena 쿼리가 실패하는 이유는 무엇입니까?
Amazon Athena에서 데이터를 쿼리할 때 다음 중 하나와 비슷한 오류가 발생합니다. "HIVE_BAD_DATA: Error parsing field value for field X: For input string: "12312845691" "HIVE_BAD_DATA: Error parsing column '0': target scale must be larger than source scale"
간략한 설명
HIVE_BAD_DATA 오류에는 여러 버전이 있습니다. 오류 메시지가 null 또는 빈 입력 문자열(예: "For input string: """)을 지정하는 경우 Amazon Athena에서 CSV 데이터를 쿼리하는 경우 "HIVE_BAD_DATA: Error parsing field value '' for field X: For input string: """ 오류가 발생하는 이유는 무엇입니까?를 참조하십시오.
값이 있는 입력 문자열을 지정하는 오류는 다음 조건 중 하나에 해당되는 경우 발생합니다.
- 테이블 정의에 정의된 데이터 형식이 실제 소스 데이터와 일치하지 않습니다.
- 단일 필드에 여러 유형의 데이터가 포함되어 있습니다(예: 한 레코드는 정수 값이고 다른 레코드는 소수점 값임).
해결 방법
열 하나에 데이터 형식을 하나만 사용하는 것이 가장 좋습니다. 그렇지 않으면, 쿼리에 실패할 수 있습니다. 이 오류를 해결하려면 각 열에 동일한 데이터 형식의 값이 포함되어 있고 값이 허용된 범위에 속해야 합니다.
그래도 오류가 발생하면 더 큰 범위의 호환 가능한 데이터 형식으로 열의 데이터 형식을 변경합니다. 데이터 형식을 변경하여 문제를 해결할 수 없는 경우 다음 예제의 해결 방법을 시도해 보십시오.
예제 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(Data Definition Language) 문:
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(Data Manipulation Language) 문:
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를 사용하여 출력과 동일한 열에서 혼합 형식 값을 캐스팅합니다. 그런 다음, 집계 함수를 열에서 실행하도록 허용합니다. 예제:
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,2) 대신, (10,7)을 사용합니다.
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/';
관련 콘텐츠
- 질문됨 2년 전lg...
- 질문됨 일 년 전lg...
- 질문됨 5달 전lg...
- AWS 공식업데이트됨 3년 전