

# 查询 JSON 数据
<a name="querying-JSON"></a>

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
```

查询结果如下所示。


****  

| \$1 | 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](openx-json-serde.md) 的，它要求每个 JSON 记录都在一个单独的行上。如果 JSON 采用漂亮打印格式，或者所有记录都在一行上，则数据将无法正确读取。

要查询采用漂亮打印格式的 JSON 数据，可以使用 [Amazon Ion Hive SerDe](ion-serde.md) 代替 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 表](ion-serde-using-create-table.md)。

前面的示例 JSON 数据不包含复杂的数据类型，如嵌套数组或结构。有关查询嵌套 JSON 数据的更多信息，请参阅 [示例：反序列化嵌套 JSON](openx-json-serde.md#nested-json-serde-example)。

**Topics**
+ [读取 JSON 数据的最佳实践](parsing-json-data.md)
+ [从字符串中提取 JSON 数据](extracting-data-from-JSON.md)
+ [在 JSON 数组中搜索值](searching-for-values.md)
+ [获取 JSON 数组的长度和大小](length-and-size.md)
+ [JSON 查询问题排查](json-troubleshooting.md)