

# Consultar dados no DynamoDB
<a name="EMRforDynamoDB.Querying"></a>

Os exemplos a seguir mostram algumas formas como você pode usar HiveQL para consultar dados armazenados no DynamoDB.

Esses exemplos referenciam a tabela *ddb\$1features* no tutorial ([Etapa 5: copiar dados para o DynamoDB](EMRforDynamoDB.Tutorial.CopyDataToDDB.md) ).

**Topics**
+ [Usar funções agregadas](#EMRforDynamoDB.Querying.AggregateFunctions)
+ [Usar cláusulas GROUP BY e HAVING](#EMRforDynamoDB.Querying.GroupByAndHaving)
+ [União de duas tabelas do DynamoDB](#EMRforDynamoDB.Querying.JoiningTwoTables)
+ [União de tabelas de origens diferentes](#EMRforDynamoDB.Querying.JoiningTablesFromDifferentSources)

## Usar funções agregadas
<a name="EMRforDynamoDB.Querying.AggregateFunctions"></a>

O HiveQL fornece funções internas para resumir valores de dados. Por exemplo, você pode usar a função `MAX` para localizar o maior valor para uma coluna selecionada. O exemplo a seguir retorna a elevação do recurso mais elevado no estado do Colorado.

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

## Usar cláusulas GROUP BY e HAVING
<a name="EMRforDynamoDB.Querying.GroupByAndHaving"></a>

Você pode usar a cláusula `GROUP BY` para coletar dados em vários registros. Ela é usada frequentemente com uma função agregada, como `SUM`, `COUNT`, `MIN` ou `MAX`. Você também pode usar a cláusula `HAVING` para descartar os resultados que não atenderem a determinados critérios.

O exemplo a seguir retorna uma lista das elevações mais altas entre os estados que têm mais de cinco recursos na tabela *ddb\$1features*.

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

## União de duas tabelas do DynamoDB
<a name="EMRforDynamoDB.Querying.JoiningTwoTables"></a>

O exemplo a seguir mapeia outra tabela do Hive (*east\$1coast\$1states*) em uma tabela no DynamoDB. A instrução `SELECT` é uma junção entre essas duas tabelas. A junção é calculada no cluster e retornada. A junção não ocorre no DynamoDB. 

Considere uma tabela do DynamoDB chamada EastCoastStates que contém os seguintes dados:

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

Vamos supor que a tabela esteja disponível como uma tabela externa do Hive chamada east\$1coast\$1states:

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

A junção a seguir retorna os estados na Costa Leste dos Estados Unidos que têm pelo menos três recursos:

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

## União de tabelas de origens diferentes
<a name="EMRforDynamoDB.Querying.JoiningTablesFromDifferentSources"></a>

No exemplo a seguir, s3\$1east\$1coast\$1states é uma tabela do Hive associada a um arquivo CSV armazenado no Amazon S3. A tabela *ddb\$1features* é associada aos dados no DynamoDB. O exemplo a seguir junta essas duas tabelas, retornando os recursos geográficas de estados cujos nomes começam com "Nova".

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