Hive JSON SerDe - Amazon Athena

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://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 指定时间戳格式

要解析字符串中的时间戳值,可以将 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 语句,请参阅 查询 AWS CloudTrail日志