查询 JSON - Amazon Athena

查询 JSON

Amazon Athena 可让您查询 JSON 编码的数据,从嵌套 JSON 中提取数据,搜索值,以及查找 JSON 数组的长度和大小。要了解在 Athena 中查询 JSON 数据的基础知识,请考虑下列星球数据示例:

{name:"Mercury",distanceFromSun:0.39,orbitalPeriod:0.24,dayLength:58.65} {name:"Venus",distanceFromSun:0.72,orbitalPeriod:0.62,dayLength:243.02} {name:"Earth",distanceFromSun:1.00,orbitalPeriod:1.00,dayLength:1.00} {name:"Mars",distanceFromSun:1.52,orbitalPeriod:1.88,dayLength:1.03}

请注意每个记录(实际上是表中的每一行)是如何位于一个单独的行上的。要查询此 JSON 数据,可以使用如下 CREATE TABLE 语句:

CREATE EXTERNAL TABLE `planets_json`( `name` string, `distancefromsun` double, `orbitalperiod` double, `daylength` double) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/json/'

要查询数据,请使用类似以下示例的简单 SELECT 语句。

SELECT * FROM planets_json

查询结果如下所示。

# name distancefromsun orbitalperiod daylength
1 水星 0.39 0.24 58.65
2 金星 0.72 0.62 243.02
3 地球 1.0 1.0 1.0
4 火星 1.52 1.88 1.03

请注意 CREATE TABLE 语句是如何使用 OpenX JSON SerDe 的,它要求每个 JSON 记录都在一个单独的行上。如果 JSON 采用漂亮打印格式,或者所有记录都在一行上,则数据将无法正确读取。

要查询采用漂亮打印格式的 JSON 数据,可以使用 Amazon Ion Hive SerDe 代替 OpenX JSON Serde。考虑以前以漂亮打印格式存储的数据:

{ name:"Mercury", distanceFromSun:0.39, orbitalPeriod:0.24, dayLength:58.65 } { name:"Venus", distanceFromSun:0.72, orbitalPeriod:0.62, dayLength:243.02 } { name:"Earth", distanceFromSun:1.00, orbitalPeriod:1.00, dayLength:1.00 } { name:"Mars", distanceFromSun:1.52, orbitalPeriod:1.88, dayLength:1.03 }

要在不重新设置格式的情况下查询这些数据,可以使用如下 CREATE TABLE 语句。请注意,语句不是指定 OpenX JSON SerDe,而是指定 STORED AS ION

CREATE EXTERNAL TABLE `planets_ion`( `name` string, `distancefromsun` DECIMAL(10, 2), `orbitalperiod` DECIMAL(10, 2), `daylength` DECIMAL(10, 2)) STORED AS ION LOCATION 's3://DOC-EXAMPLE-BUCKET/json-ion/'

查询 SELECT * FROM planets_ion 产生的结果与以前相同。有关使用 Amazon Ion Hive SerDe 以这种方式创建表的更多信息,请参阅 使用 CREATE TABLE 创建 Amazon Ion 表

前面的示例 JSON 数据不包含复杂的数据类型,如嵌套数组或结构。有关查询嵌套 JSON 数据的更多信息,请参阅 示例:反序列化嵌套 JSON