Hive JSON SerDe 常用于处理诸如事件之类的 JSON 数据。这些事件表示为用新行分隔的 JSON 编码文本的单行字符串。Hive JSON SerDe 不允许 map
或 struct
键名称中出现重复的键。
注意
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日志。