

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 查詢 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
```

查詢結果如下所示。


****  

| \# | name | distancefromsun | orbitalperiod | daylength | 
| --- | --- | --- | --- | --- | 
| 1 | Mercury | 0.39 | 0.24 | 58.65 | 
| 2 | Venus | 0.72 | 0.62 | 243.02 | 
| 3 | Earth | 1.0 | 1.0 | 1.0 | 
| 4 | Mars | 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)