

# Consulta de datos en DynamoDB
<a name="EMRforDynamoDB.Querying"></a>

En los siguientes ejemplos se muestran algunas formas de usar HiveQL para consultar los datos almacenados en DynamoDB.

Estos ejemplos se refieren a la tabla *ddb\$1features* del tutorial ([Paso 5: copiar los datos a DynamoDB](EMRforDynamoDB.Tutorial.CopyDataToDDB.md)).

**Topics**
+ [Uso de funciones de agregación](#EMRforDynamoDB.Querying.AggregateFunctions)
+ [Uso de las cláusulas GROUP BY y HAVING](#EMRforDynamoDB.Querying.GroupByAndHaving)
+ [Unión de dos tablas de DynamoDB](#EMRforDynamoDB.Querying.JoiningTwoTables)
+ [Unión de tablas de orígenes diferentes](#EMRforDynamoDB.Querying.JoiningTablesFromDifferentSources)

## Uso de funciones de agregación
<a name="EMRforDynamoDB.Querying.AggregateFunctions"></a>

HiveQL proporciona funciones integradas para sintetizar los valores de los datos. Por ejemplo, puede utilizar la función `MAX` para hallar el valor máximo de una columna seleccionada. En el siguiente ejemplo se devuelve la altitud del accidente geográfico más alto del estado de Colorado.

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

## Uso de las cláusulas GROUP BY y HAVING
<a name="EMRforDynamoDB.Querying.GroupByAndHaving"></a>

Puede utilizar la cláusula `GROUP BY` para recopilar datos a través de varios registros. Esto se usa a menudo con una función de agregación, como `SUM`, `COUNT`, `MIN` o `MAX`. También puede usar la cláusula `HAVING` para descartar todos los resultados que no cumplan determinados criterios.

En el siguiente ejemplo se devuelve una lista con las cinco mayores altitudes de aquellos estados que tienen más de cinco accidentes geográficos contenidos en la tabla *ddb\$1features*.

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

## Unión de dos tablas de DynamoDB
<a name="EMRforDynamoDB.Querying.JoiningTwoTables"></a>

En el siguiente ejemplo se mapea otra tabla de Hive (*east\$1coast\$1states*) a una tabla de DynamoDB. La instrucción `SELECT` es una unión de estas dos tablas. La unión se calcula en el clúster y se devuelve. La unión no tiene lugar en DynamoDB. 

Tomemos una tabla de DynamoDB denominada EastCoastStates que contiene los siguientes datos:

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

Supongamos que la tabla está disponible como una tabla de Hive externa denominada 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");
```

La unión siguiente devuelve los estados de la costa oriental de Estados Unidos que tienen al menos tres accidentes geográficos:

```
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ón de tablas de orígenes diferentes
<a name="EMRforDynamoDB.Querying.JoiningTablesFromDifferentSources"></a>

En el siguiente ejemplo, s3\$1east\$1coast\$1states es una tabla de Hive asociada a un archivo CSV almacenado en Amazon S3. La tabla *ddb\$1features* está asociada con datos de DynamoDB. En el ejemplo siguiente se unen estas dos tablas y se devuelven los accidentes geográficos de los estados cuyos nombres comienzan por "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%';
```