

# 查询 DynamoDB 中的数据
<a name="EMRforDynamoDB.Querying"></a>

以下示例显示使用 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)

## 使用聚合函数
<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;
```

## 求两个 DynamoDB 表的交集
<a name="EMRforDynamoDB.Querying.JoiningTwoTables"></a>

下面的示例将另一个 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");
```

以下联接返回美国东海岸至少具有三个地形的州：

```
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 中的数据相关联。下面的示例联接这两个表，从名称以“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%';
```