

# DynamoDB의 데이터 쿼리


다음 예제에서는 HiveQL을 사용하여 DynamoDB에 저장된 데이터를 쿼리할 수 있는 몇 가지 방법을 보여 줍니다.

이러한 예제에서는 자습서([5단계: DynamoDB로 데이터 복사](EMRforDynamoDB.Tutorial.CopyDataToDDB.md))의 *ddb\$1features* 테이블을 참조합니다.

**Topics**
+ [

## 집계 함수 사용
](#EMRforDynamoDB.Querying.AggregateFunctions)
+ [

## GROUP BY 및 HAVING 절 사용
](#EMRforDynamoDB.Querying.GroupByAndHaving)
+ [

## 두 DynamoDB 테이블 조인
](#EMRforDynamoDB.Querying.JoiningTwoTables)
+ [

## 서로 다른 소스의 테이블 조인
](#EMRforDynamoDB.Querying.JoiningTablesFromDifferentSources)

## 집계 함수 사용


HiveQL은 데이터 값을 요약하기 위한 내장 함수를 제공합니다. 예를 들어 `MAX` 함수를 사용하여 선택한 열에서 최대 값을 찾을 수 있습니다. 다음 예제는 콜로라도 주에서 가장 높은 지형의 고도를 반환합니다.

```
SELECT MAX(elev_in_ft)
FROM ddb_features
WHERE state_alpha = 'CO';
```

## GROUP BY 및 HAVING 절 사용


`GROUP BY` 절을 사용하여 여러 레코드에서 데이터를 수집할 수 있습니다. 이 절은 종종 `SUM`, `COUNT`, `MIN`, `MAX`와 같은 집계 함수와 함께 사용됩니다. 또한 `HAVING` 절을 사용하여 특정 기준을 충족하지 않는 결과를 모두 폐기할 수도 있습니다.

다음 예제는 *ddb\$1features* 테이블에서 5개 이상의 지형이 있는 주에서 최고 고도의 목록을 반환합니다.

```
SELECT state_alpha, max(elev_in_ft)
FROM ddb_features
GROUP BY state_alpha
HAVING count(*) >= 5;
```

## 두 DynamoDB 테이블 조인


다음은 다른 Hive 테이블(*east\$1coast\$1states*)을 DynamoDB의 테이블로 매핑하는 예입니다. `SELECT` 문은 이들 두 테이블의 조인입니다. 조인은 클러스터에서 계산되어 반환됩니다. DynamoDB에서는 조인이 일어나지 않습니다.

다음 데이터를 포함하는 EastCoastStates라는 이름의 DynamoDB 테이블을 생각해 보겠습니다.

```
StateName       StateAbbrev

Maine           ME
New Hampshire   NH
Massachusetts   MA
Rhode Island    RI
Connecticut     CT
New York        NY
New Jersey      NJ
Delaware        DE
Maryland        MD
Virginia        VA
North Carolina  NC
South Carolina  SC
Georgia         GA
Florida         FL
```

이 테이블을 east\$1coast\$1states라는 Hive 외부 테이블로 사용 가능하다고 가정하겠습니다.

```
1. CREATE EXTERNAL TABLE ddb_east_coast_states (state_name STRING, state_alpha STRING)
2. STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
3. TBLPROPERTIES ("dynamodb.table.name" = "EastCoastStates",
4. "dynamodb.column.mapping" = "state_name:StateName,state_alpha:StateAbbrev");
```

다음 조인은 지형이 3개 이상 있는 미국 동부 연안 주를 반환합니다.

```
SELECT ecs.state_name, f.feature_class, COUNT(*)
FROM ddb_east_coast_states ecs
JOIN ddb_features f on ecs.state_alpha = f.state_alpha
GROUP BY ecs.state_name, f.feature_class
HAVING COUNT(*) >= 3;
```

## 서로 다른 소스의 테이블 조인


다음 예제에서는 s3\$1east\$1coast\$1states가 Amazon S3에 저장된 CSV 파일과 연결된 Hive 테이블입니다. *ddb\$1features* 테이블은 DynamoDB의 데이터와 연결됩니다. 다음 예제는 이들 두 테이블을 조인하여 이름이 "New"로 시작하는 주에서 지형을 반환합니다.

```
1. create external table s3_east_coast_states (state_name STRING, state_alpha STRING)
2. ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
3. LOCATION 's3://bucketname/path/subpath/';
```

```
SELECT ecs.state_name, f.feature_name, f.feature_class
FROM s3_east_coast_states ecs
JOIN ddb_features f
ON ecs.state_alpha = f.state_alpha
WHERE ecs.state_name LIKE 'New%';
```