

# DynamoDB 内データのクエリ
<a name="EMRforDynamoDB.Querying"></a>

次の例で、DynamoDB に保存されたデータへのクエリに、HiveQL を使用する方法をいくつか示します。

これらの例は、チュートリアル ([ステップ 5: データを DynamoDB にコピーします](EMRforDynamoDB.Tutorial.CopyDataToDDB.md)) にある ddb\$1features テーブルを参照しています。

**Topics**
+ [集計関数の使用](#EMRforDynamoDB.Querying.AggregateFunctions)
+ [GROUP BY 句および HAVING 句の使用](#EMRforDynamoDB.Querying.GroupByAndHaving)
+ [2 つの DynamoDB テーブルの結合](#EMRforDynamoDB.Querying.JoiningTwoTables)
+ [異なるソースからのテーブルの結合](#EMRforDynamoDB.Querying.JoiningTablesFromDifferentSources)

## 集計関数の使用
<a name="EMRforDynamoDB.Querying.AggregateFunctions"></a>

HiveQL では、データ値を集計するための組み込み関数が利用できます。例えば、選択した列で最大値を検索するためには `MAX` 関数を使用できます。次の例では、コロラド州で標高が最も高いという特徴を返します。

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

## GROUP BY 句および HAVING 句の使用
<a name="EMRforDynamoDB.Querying.GroupByAndHaving"></a>

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

## 2 つの DynamoDB テーブルの結合
<a name="EMRforDynamoDB.Querying.JoiningTwoTables"></a>

次の例では、DynamoDB 内のテーブルに対し、別の Hive テーブル (east\$1coast\$1states) をマッピングしています。`SELECT` ステートメントにより、これらの 2 つのテーブル間での結合が行われます。結合はクラスターで計算され、以下を返します。結合は 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;
```

## 異なるソースからのテーブルの結合
<a name="EMRforDynamoDB.Querying.JoiningTablesFromDifferentSources"></a>

次の例では、s3\$1east\$1coast\$1states は、Amazon S3 に格納された CSV ファイルに関連付けられた Hive テーブルです。ddb\$1features テーブルは DynamoDB 内のデータに関連付けられています。この例では、これら 2 つのテーブルを結合し、名前が「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%';
```