

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

Hive JSON SerDe 常用于处理诸如事件之类的 JSON 数据。这些事件表示为用新行分隔的 JSON 编码文本的单行字符串。Hive JSON SerDe 不允许 `map` 或 `struct` 键名称中出现重复的键。

**注意**  
SerDe 期望每个 JSON 文档都位于单行文本中，并且不使用行终止字符分隔记录中的字段。如果 JSON 文本采用美观的打印格式，当您在创建表后尝试对其进行查询时，可能会收到类似以下内容的错误消息：HIVE\$1CURSOR\$1ERROR: Row is not a valid JSON Object（HIVE\$1CURSOR\$1ERROR：行不是有效的 JSON 对象）或 HIVE\$1CURSOR\$1ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT（HIVE\$1CURSOR\$1ERROR：JsonParseException：意外的输入结束：对象的预期关闭标记）。有关更多信息，请参阅 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>

要解析字符串中的时间戳值，可以将 `WITH SERDEPROPERTIES` 子字段添加到 `ROW FORMAT SERDE` 子句，然后用它来指定 `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 文档中的 [时间戳](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>

要查询 CloudTrail 日志，您可以使用 Hive JSON SerDe。有关更多信息以及示例 `CREATE TABLE` 语句，请参阅 [查询 Amazon CloudTrail日志](cloudtrail-logs.md)。