

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Copia di dati tra DynamoDB e HDFS
<a name="EMRforDynamoDB.CopyingData.HDFS"></a>

Se si dispone di dati in una tabella DynamoDB, è possibile utilizzare Hive per copiare i dati nel file di sistema distribuito Hadoop (HDFS).

Questa operazione può essere eseguita se si esegue un MapReduce processo che richiede dati provenienti da DynamoDB. Se si copiano i dati da DynamoDB in HDFS, Hadoop può elaborarli utilizzando tutti i nodi disponibili nel cluster Amazon EMR in parallelo. Una volta completato il MapReduce processo, è possibile scrivere i risultati da HDFS a DDB.

Negli esempi seguenti, Hive leggerà e scriverà nella seguente directory HDFS: `/user/hadoop/hive-test`

**Nota**  
Gli esempi in questa sezione presuppongono che sia stata seguita la procedura in [Tutorial: Utilizzo di Amazon DynamoDB e Apache Hive](EMRforDynamoDB.Tutorial.md) e che sia presente una tabella esterna in DynamoDB denominata *ddb\_features*. 

**Topics**
+ [Copia di dati utilizzando il formato predefinito Hive](#EMRforDynamoDB.CopyingData.HDFS.DefaultFormat)
+ [Copia di dati con un formato specificato dall'utente](#EMRforDynamoDB.CopyingData.HDFS.UserSpecifiedFormat)
+ [Copia di dati senza mappature di colonne](#EMRforDynamoDB.CopyingData.HDFS.NoColumnMapping)
+ [Accesso ai dati in HDFS](#EMRforDynamoDB.CopyingData.HDFS.ViewingData)

## Copia di dati utilizzando il formato predefinito Hive
<a name="EMRforDynamoDB.CopyingData.HDFS.DefaultFormat"></a>

**Example Da DynamoDB a HDFS**  
Utilizza un'istruzione `INSERT OVERWRITE` per scrivere direttamente su HDFS.  

```
INSERT OVERWRITE DIRECTORY 'hdfs:///user/hadoop/hive-test'
SELECT * FROM ddb_features;
```
Il file di dati in HDFS ha il seguente aspetto:  

```
920709^ASoldiers Farewell Hill^ASummit^ANM^A32.3564729^A-108.33004616135
1178153^AJones Run^AStream^APA^A41.2120086^A-79.25920781260
253838^ASentinel Dome^ASummit^ACA^A37.7229821^A-119.584338133
264054^ANeversweet Gulch^AValley^ACA^A41.6565269^A-122.83614322900
115905^AChacaloochee Bay^ABay^AAL^A30.6979676^A-87.97388530
```
Ogni campo è separato da un carattere SOH (inizio dell'intestazione, 0x01). Nel file, SOH appare come **^A**.

**Example Da HDFS a DynamoDB**  

1. Crea una tabella esterna che si mappa ai dati non formattati in HDFS.

   ```
   CREATE EXTERNAL TABLE hdfs_features_unformatted
       (feature_id       BIGINT,
       feature_name      STRING ,
       feature_class     STRING ,
       state_alpha       STRING,
       prim_lat_dec      DOUBLE ,
       prim_long_dec     DOUBLE ,
       elev_in_ft        BIGINT)
   LOCATION 'hdfs:///user/hadoop/hive-test';
   ```

1. Copiare i dati in DynamoDB.

   ```
   INSERT OVERWRITE TABLE ddb_features
   SELECT * FROM hdfs_features_unformatted;
   ```

## Copia di dati con un formato specificato dall'utente
<a name="EMRforDynamoDB.CopyingData.HDFS.UserSpecifiedFormat"></a>

Se desideri utilizzare un carattere di separatore di campo diverso, è possibile creare una tabella esterna mappata alla directory HDFS. È possibile utilizzare questa tecnica per creare file di dati con valori separati da virgole (CSV).

**Example Da DynamoDB a HDFS**  

1. Crea una tabella esterna Hive mappata ad HDFS. Quando si esegue questa operazione, assicurarsi che i tipi di dati siano coerenti con quelli della tabella esterna DynamoDB.

   ```
   CREATE EXTERNAL TABLE hdfs_features_csv
       (feature_id       BIGINT,
       feature_name      STRING ,
       feature_class     STRING ,
       state_alpha       STRING,
       prim_lat_dec      DOUBLE ,
       prim_long_dec     DOUBLE ,
       elev_in_ft        BIGINT)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY ','
   LOCATION 'hdfs:///user/hadoop/hive-test';
   ```

1. Copiare i dati da DynamoDB.

   ```
   INSERT OVERWRITE TABLE hdfs_features_csv
   SELECT * FROM ddb_features;
   ```
Il file di dati in HDFS ha il seguente aspetto:  

```
920709,Soldiers Farewell Hill,Summit,NM,32.3564729,-108.3300461,6135
1178153,Jones Run,Stream,PA,41.2120086,-79.2592078,1260
253838,Sentinel Dome,Summit,CA,37.7229821,-119.58433,8133
264054,Neversweet Gulch,Valley,CA,41.6565269,-122.8361432,2900
115905,Chacaloochee Bay,Bay,AL,30.6979676,-87.9738853,0
```

**Example Da HDFS a DynamoDB**  
Con una singola istruzione HiveQL, è possibile popolare la tabella DynamoDB utilizzando i dati da HDFS:  

```
INSERT OVERWRITE TABLE ddb_features
SELECT * FROM hdfs_features_csv;
```

## Copia di dati senza mappature di colonne
<a name="EMRforDynamoDB.CopyingData.HDFS.NoColumnMapping"></a>

È possibile copiare i dati da DynamoDB in un formato non elaborato e scriverli in HDFS senza specificare alcun tipo di dati o mappatura di colonne. Questo metodo può essere utilizzato per creare un archivio dei dati DynamoDB e memorizzarlo in HDFS.



**Nota**  
Se la tabella DynamoDB contiene attributi di tipo Map, List, Boolean o Null, allora questo è l'unico modo per utilizzare Hive per copiare i dati da DynamoDB a HDFS.

**Example Da DynamoDB a HDFS**  

1. Crea una tabella esterna associata alla tabella DynamoDB. In questa istruzione HiveQL non c'è `dynamodb.column.mapping`.

   ```
   CREATE EXTERNAL TABLE ddb_features_no_mapping
       (item MAP<STRING, STRING>)
   STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
   TBLPROPERTIES ("dynamodb.table.name" = "Features");
   ```

   

1. Crea un'altra tabella esterna associata alla directory HDFS.

   ```
   CREATE EXTERNAL TABLE hdfs_features_no_mapping
       (item MAP<STRING, STRING>)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\t'
   LINES TERMINATED BY '\n'
   LOCATION 'hdfs:///user/hadoop/hive-test';
   ```

1. Copiare i dati da DynamoDB ad HDFS.

   ```
   INSERT OVERWRITE TABLE hdfs_features_no_mapping
   SELECT * FROM ddb_features_no_mapping;
   ```
Il file di dati in HDFS ha il seguente aspetto:  

```
Name^C{"s":"Soldiers Farewell Hill"}^BState^C{"s":"NM"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"6135"}^BLatitude^C{"n":"32.3564729"}^BId^C{"n":"920709"}^BLongitude^C{"n":"-108.3300461"}
Name^C{"s":"Jones Run"}^BState^C{"s":"PA"}^BClass^C{"s":"Stream"}^BElevation^C{"n":"1260"}^BLatitude^C{"n":"41.2120086"}^BId^C{"n":"1178153"}^BLongitude^C{"n":"-79.2592078"}
Name^C{"s":"Sentinel Dome"}^BState^C{"s":"CA"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"8133"}^BLatitude^C{"n":"37.7229821"}^BId^C{"n":"253838"}^BLongitude^C{"n":"-119.58433"}
Name^C{"s":"Neversweet Gulch"}^BState^C{"s":"CA"}^BClass^C{"s":"Valley"}^BElevation^C{"n":"2900"}^BLatitude^C{"n":"41.6565269"}^BId^C{"n":"264054"}^BLongitude^C{"n":"-122.8361432"}
Name^C{"s":"Chacaloochee Bay"}^BState^C{"s":"AL"}^BClass^C{"s":"Bay"}^BElevation^C{"n":"0"}^BLatitude^C{"n":"30.6979676"}^BId^C{"n":"115905"}^BLongitude^C{"n":"-87.9738853"}
```
Ogni campo inizia con un carattere STX (inizio del testo, 0x02) e termina con un carattere ETX (fine del testo, 0x03). Nel file, STX viene visualizzato come **^B** e ETX viene visualizzato come **^C**.

**Example Da HDFS a DynamoDB**  
Con una singola istruzione HiveQL, è possibile popolare la tabella DynamoDB utilizzando i dati da HDFS:  

```
INSERT OVERWRITE TABLE ddb_features_no_mapping
SELECT * FROM hdfs_features_no_mapping;
```

## Accesso ai dati in HDFS
<a name="EMRforDynamoDB.CopyingData.HDFS.ViewingData"></a>

HDFS è un file system distribuito, accessibile a tutti i nodi del cluster Amazon EMR. Se per connettersi al nodo principale si utilizza SSH, è possibile utilizzare gli strumenti a riga di comando per accedere ai dati che Hive ha scritto su HDFS.

HDFS non è la stessa cosa del file system locale sul nodo principale. Non è possibile lavorare con file e directory in HDFS utilizzando comandi Linux standard (come `cat`, `cp`, `mv` o `rm`). Invece, queste attività vengono eseguite utilizzando il comando `hadoop fs`.

I passaggi seguenti presuppongono che siano stati copiati i dati da DynamoDB ad HDFS utilizzando una delle procedure descritte in questa sezione.

1. Se ti trovi attualmente al prompt dei comandi di Hive, passa al prompt dei comandi di Linux.

   ```
   hive> exit;
   ```

1. Elenca il contenuto della directory/user/hadoop/hive-test in HDFS. Questo è il percorso in cui Hive ha copiato i dati da DynamoDB.

   ```
   hadoop fs -ls /user/hadoop/hive-test
   ```

   La risposta dovrebbe essere simile alla seguente:

   ```
   Found 1 items
   -rw-r--r-- 1 hadoop hadoop 29504 2016-06-08 23:40 /user/hadoop/hive-test/000000_0
   ```

   Il nome del file (*000000\_0*) è generato dal sistema.

1. Visualizzare il contenuto del file :

   ```
   hadoop fs -cat /user/hadoop/hive-test/000000_0
   ```
**Nota**  
In questo esempio, il file è relativamente piccolo (circa 29 KB). Fare attenzione quando si utilizza questo comando con file molto grandi o contenenti caratteri non stampabili.

1. (Facoltativo) È possibile copiare il file di dati da HDFS nel file system locale sul nodo principale. Successivamente, sarà possibile utilizzare le utilità della riga di comando Linux standard per lavorare con i dati nel file.

   ```
   hadoop fs -get /user/hadoop/hive-test/000000_0
   ```

   Questo comando non sovrascriverà il file.
**Nota**  
Il file system locale sul nodo principale ha una capacità limitata. Non utilizzare questo comando con file più grandi dello spazio disponibile nel file system locale.