

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

# 查詢 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* 資料表中具有五個以上特徵的州的最高海拔清單。

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