

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

Hive JSON SerDe は通常、イベントなどの JSON データを処理するために使用されます。これらのイベントは、改行で区切られ JSON 形式でエンコードされたテキストの 1 行の文字列として表現されます。Hive JSON SerDe では、`map` または `struct` キー名に重複するキーを使用できません。

**注記**  
SerDe では、各 JSON ドキュメントが、レコード内のフィールドを区切る行終端文字なしの、1 行のテキストに収まっていることを想定しています。JSON テキストがプリティプリント形式の場合、テーブルを作成した後にクエリを実行しようとすると、以下のようなエラーメッセージが表示される場合があります。「HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object」、または「HIVE\$1CURSOR\$1ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT」。詳細については、GitHub の OpenX SerDe のドキュメントで「[JSON Data Files](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files)」(JSON データファイル) を参照してください。

次の 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>

文字列からタイムスタンプ値を解析するには、`WITH SERDEPROPERTIES` サブフィールドを `ROW FORMAT SERDE` 句に追加し、これを使用して、`timestamp.formats` パラメータを指定します。パラメータで、次の例のように、1 つまたは複数のタイムスタンプパターンのコンマ区切りリストを指定します。

```
...
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 ドキュメントの「[タイムスタンプ](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)」を参照してください。