

# Hive JSON SerDe
<a name="hive-json-serde"></a>

Hive JSON SerDe는 일반적으로 이벤트와 같은 JSON 데이터를 처리하는 데 사용됩니다. 이러한 이벤트는 새 줄로 구분된 JSON 인코딩 텍스트의 한 줄 문자열로 표시됩니다. Hive JSON SerDe는 `map` 또는 `struct` 키 이름에 중복 키를 허용하지 않습니다.

**참고**  
SerDe는 각 JSON 문서가 레코드의 필드를 구분하는 줄 종료 문자가 없는 한 줄의 텍스트에 있을 것으로 예상합니다. JSON 텍스트가 가독성 좋게 꾸민 형식이면 테이블을 만든 후 쿼리하려고 할 때 HIVE\_CURSOR\_ERROR: 행이 유효한 JSON 객체가 아님(HIVE\_CURSOR\_ERROR: Row is not a valid JSON Object) 또는 HIVE\_CURSOR\_ERROR: JsonParseException: 예기치 않은 입력 종료: OBJECT의 닫기 마커 필요(HIVE\_CURSOR\_ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT) 같은 오류 메시지가 나타날 수 있습니다. 자세한 내용은 GitHub의 OpenX SerDe 문서에서 [JSON 데이터 파일](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files)을 참조하세요.

다음 예제 DDL 문은 Hive JSON SerDe를 사용하여 샘플 온라인 광고 데이터를 기반으로 테이블을 생성합니다. `LOCATION` 절에서 `s3://amzn-s3-demo-bucket.elasticmapreduce/samples/hive-ads/tables/impressions`의 {{myregion}}을, Athena를 실행하는 리전 식별자로 바꿉니다(예: `s3://us-west-2.elasticmapreduce/samples/hive-ads/tables/impressions`).

```
CREATE EXTERNAL TABLE impressions (
    requestbegintime string,
    adid string,
    impressionid string,
    referrer string,
    useragent string,
    usercookie string,
    ip string,
    number string,
    processid string,
    browsercookie string,
    requestendtime string,
    timers struct
                <
                 modellookup:string, 
                 requesttime:string
                >,
    threadid string, 
    hostname string,
    sessionid string
)   
PARTITIONED BY (dt string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://amzn-s3-demo-bucket.elasticmapreduce/samples/hive-ads/tables/impressions';
```

## Hive JSON SerDe로 타임스탬프 형식 지정
<a name="hive-json-serde-timestamp-formats"></a>

문자열에서 타임스탬프 값을 구문 분석하려면 `ROW FORMAT SERDE`절에 `WITH SERDEPROPERTIES` 하위 필드을 추가하고 이를 사용하여 `timestamp.formats` 파라미터를 지정할 수 있습니다. 파라미터에서 아래 예제와 같이 하나 이상의 타임스탬프 패턴를 쉼표로 구분한 목록을 지정합니다.

```
...
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
WITH SERDEPROPERTIES ("timestamp.formats"="yyyy-MM-dd'T'HH:mm:ss.SSS'Z',yyyy-MM-dd'T'HH:mm:ss")
...
```

자세한 내용은 Apache Hive 설명서의 [Timestamps](https://cwiki.apache.org/confluence/display/hive/languagemanual+types#LanguageManualTypes-TimestampstimestampTimestamps)를 참조하세요.

## 쿼리를 위한 테이블 로드
<a name="hive-json-serde-loading-the-table"></a>

테이블을 생성한 후 [MSCK REPAIR TABLE](msck-repair-table.md)을 실행하여 테이블을 로드하면 Athena에서 쿼리가 가능합니다.

```
MSCK REPAIR TABLE impressions
```

## CloudTrail 로그 쿼리
<a name="hive-json-serde-querying-cloud-trail-logs"></a>

Hive JSON SerDe를 사용하여 CloudTrail 로그를 쿼리할 수 있습니다. 자세한 내용과 예제 `CREATE TABLE` 문은 [AWS CloudTrail 로그 쿼리](cloudtrail-logs.md) 단원을 참조하세요.