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

OpenX JSON SerDe

除了表中列的 paths 属性,OpenX JSON SerDe 具有以下可选属性,这些属性对于解决数据中的不一致性很有用。

ignore.malformed.json

可选。设置为 TRUE 时,可让您跳过格式错误的 JSON 语法。默认为 FALSE

dots.in.keys

可选。默认为 FALSE。设置为 TRUE 时,允许 SerDe 使用下划线替换键名称中的点。例如,如果 JSON 数据集包含名为 "a.b" 的键,您可以在 Athena 中使用此属性来定义列名 "a_b"。预设情况下(没有此 SerDe),Athena 不允许在列名中使用点。

case.insensitive

可选。默认为 TRUE。设置为 TRUE 时,SerDe 将所有大写列转换为小写。

要在数据中使用区分大小写的键名,请使用 WITH SERDEPROPERTIES ("case.insensitive"= FALSE;)。然后,对于每个非全部小写的键,请使用以下语法提供从列名到属性名的映射:

ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.userid" = "userId")

如果您有两个键(例如 URLUrl),并且二者在小写时是相同的,则可能会发生与以下内容类似的错误:

HIVE_CURSOR_ERROR: Row is not a valid JSON Object - JSONException: Duplicate key "url"(HIVE_CURSOR_ERROR:行不是有效的 JSON 对象 - JSONException:重复的键“url”)

要纠正此错误,请将 case.insensitive 属性设置为 FALSE,并将键映射到不同的名称,如以下示例所示:

ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("case.insensitive" = "FALSE", "mapping.url1" = "URL", "mapping.url2" = "Url")
映射

可选。将列名映射到与列名不同的 JSON 键。当 JSON 数据包含作为关键字的键时,mapping 参数很有用。例如,如果您有名为 timestamp 的 JSON 键,请使用以下语法将该键映射到名为 ts 的列:

ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ("mapping.ts"= "timestamp")

与 Hive JSON SerDe 一样,OpenX JSON SerDe 不允许 mapstruct 键名称中出现重复的键。

以下示例 DDL 语句使用 OpenX JSON SerDe 基于 Hive JSON SerDe 示例中使用的相同示例在线广告数据创建表。在 LOCATION 子句中,将 myregion 替换为您运行 Athena 的区域的标识符。

CREATE EXTERNAL TABLE impressions ( requestbegintime string, adid string, impressionId string, referrer string, useragent string, usercookie string, ip string, number string, processid string, browsercokie string, requestendtime string, timers struct< modellookup:string, requesttime:string>, threadid string, hostname string, sessionid string ) PARTITIONED BY (dt string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' with serdeproperties ( 'paths'='requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip' ) LOCATION 's3://myregion.elasticmapreduce/samples/hive-ads/tables/impressions';
注意

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 数据文件

示例:反序列化嵌套 JSON

您可以使用 JSON SerDes 来解析更复杂的 JSON 编码数据。这要求使用 CREATE TABLE 语句,而这些语句使用 structarray 元素来表示嵌套结构。

以下示例根据具有嵌套结构的 JSON 数据创建 Athena 表。要在 Athena 中解析 JSON 编码的数据,请确保每个 JSON 文档都各占一行,并用换行符分隔。

此示例假定 JSON 编码的数据具有以下结构:

{ "DocId": "AWS", "User": { "Id": 1234, "Username": "bob1234", "Name": "Bob", "ShippingAddress": { "Address1": "123 Main St.", "Address2": null, "City": "Seattle", "State": "WA" }, "Orders": [ { "ItemId": 6789, "OrderDate": "11/11/2017" }, { "ItemId": 4352, "OrderDate": "12/12/2017" } ] } }

以下 CREATE TABLE 语句将 OpenX-JSONSerdestructarray 集合数据类型结合使用来建立对象组。每个 JSON 文档都在其自己的行上列出,并用换行符分隔。为了避免错误,所查询的数据不会在 struct 或映射键名称中包含重复的键。

CREATE external TABLE complex_json ( docid string, `user` struct< id:INT, username:string, name:string, shippingaddress:struct< address1:string, address2:string, city:string, state:string >, orders:array< struct< itemid:INT, orderdate:string > > > ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://mybucket/myjsondata/';