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://amzn-s3-demo-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://amzn-s3-demo-bucket/json-ion/'
查询 SELECT * FROM planets_ion
产生的结果与以前相同。有关使用 Amazon Ion Hive SerDe 以这种方式创建表的更多信息,请参阅 创建 Amazon Ion 表。
前面的示例 JSON 数据不包含复杂的数据类型,如嵌套数组或结构。有关查询嵌套 JSON 数据的更多信息,请参阅 示例:反序列化嵌套 JSON。