Hive JSON SerDe - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Hive JSON SerDe

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

注意

SerDe 期望每个 JSON 文档都位于单行文本中,并且不使用行终止字符分隔记录中的字段。如果 JSON 文本采用美观的打印格式,当您在创建表后尝试对其进行查询时,可能会收到类似以下内容的错误消息:HIVE_CURSOR_ERROR: Row is not a valid JSON Object(HIVE_CURSOR_ERROR:行不是有效的 JSON 对象)或 HIVE_CURSOR_ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT(HIVE_CURSOR_ERROR:JsonParseException:意外的输入结束:对象的预期关闭标记)。有关更多信息,请参阅 GitHub 上 OpenX SerDe 文档中的 JSON 数据文件

以下示例 DDL 语句使用 Hive JSON SerDe 基于示例在线广告数据创建表。在 LOCATION 子句中,将 s3://myregion.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://myregion.elasticmapreduce/samples/hive-ads/tables/impressions';

使用 Hive JSON SerDe 指定时间戳格式

要解析字符串中的时间戳值,可以将 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 文档中的 时间戳

加载用于查询的表

创建表后,运行 MSCK REPAIR TABLE 以加载表并使其可从 Athena 进行查询:

MSCK REPAIR TABLE impressions

查询 CloudTrail 日志

要查询 CloudTrail 日志,您可以使用 Hive JSON SerDe。有关更多信息以及示例 CREATE TABLE 语句,请参阅 查询 Amazon CloudTrail 日志