Amazon Athena에서 JSON 데이터를 읽으려고 하면 오류가 발생합니다.

최종 업데이트 날짜: 2019년 5월 9일

Amazon Athena에서 JSON 데이터를 읽으려고 하면 NULL 또는 잘못된 데이터 오류가 발생합니다. 이 문제를 해결하려면 어떻게 해야 합니까?

​해결 방법

다음과 같은 일반적인 문제를 확인합니다.

올바른 JSON SerDe 사용

Athena는 2개 JSON SerDes 중 하나를 사용하여 JSON 데이터를 처리합니다.

사용하는 SerDe에 대해 잘 모르는 경우 두 가지 SerDe 버전을 모두 사용해 보십시오.

레코드당 한 줄씩인지 확인

다음은 올바른 형식의 JSON 레코드입니다.

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

다음은 잘못된 형식의 JSON 레코드입니다.

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

다음 레코드도 형식이 잘못되었습니다.

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

대소문자를 구분하지 않는 열을 사용하거나 case.insensitive 속성을 false로 설정

Athena는 기본적으로 대소문자를 구분하지 않습니다. 열 이름이 대소문자만 다른 경우(예: “Column” 및 “column”), Athena에서 오류가 발생하고 Athena에 데이터가 표시되지 않습니다. 이 문제를 방지하는 가장 쉬운 방법은 대소문자를 구분하지 않는 열을 사용하여 데이터를 생성하는 것입니다.

OpenX SerDe를 사용하는 경우, 대소문자를 구분하는 키 이름을 사용할 수 있습니다. 이렇게 하려면 case.insensitive SerDe 속성을 false로 설정하고 대문자 키에 대한 매핑을 추가합니다. 예를 들어 다음과 같은 대문자 및 소문자 열을 사용하려면:

{"Username": "bob1234", "username": "bob" }

다음 SerDe 속성을 사용합니다.

CREATE external TABLE casesensitive_json (user_name String,username String)
ROW FORMAT serde 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'mapping.user_name' = 'Username','case.insensitive'='false')
LOCATION 's3://input_path';

case.insensitive 속성에 대한 자세한 내용은 OpenX JSON SerDe를 참조하십시오.

형식이 잘못된 레코드를 무시하는 옵션 제공

OpenX SerDe를 사용하는 경우, 다음 예와 같이 형식이 잘못된 레코드를 무시하도록 선택할 수 있습니다. ignore.malformed.jsontrue로 설정된 경우, 형식이 잘못된 레코드가 NULL로 반환됩니다.

CREATE EXTERNAL TABLE json (
    a string,
    b int
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 'ignore.malformed.json' = 'true')
LOCATION 's3://bucket/path/';

테이블이 생성된 후에는 새 테이블에서 새 쿼리를 실행합니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?