

# 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 | 수성 | 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` 문에서 각 JSON 레코드가 별도의 줄에 있을 것을 요구하는 [OpenX JSON SerDe](openx-json-serde.md)를 어떻게 사용하는지 확인하세요. JSON이 예쁜 인쇄 형식으로 되어 있거나 모든 레코드가 한 줄에 있는 경우 데이터를 제대로 읽을 수 없습니다.

예쁜 인쇄 형식의 JSON 데이터를 쿼리하려면 OpenX JSON SerDe 대신 [Amazon Ion Hive SerDe](ion-serde.md)를 사용할 수 있습니다. 이전 데이터가 예쁜 인쇄 형식으로 저장되어 있다고 가정해 보겠습니다.

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