

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à.

# Impostazione di una tabella Hive per l'esecuzione dei comandi Hive
<a name="EMR_Interactive_Hive"></a>

Apache Hive è un'applicazione di data warehouse che è possibile usare per eseguire query sui dati contenuti nei cluster Amazon EMR utilizzando un linguaggio di tipo SQL. Per ulteriori informazioni su Hive, visita la pagina Web all'indirizzo [http://hive.apache.org/](http://hive.apache.org/).

La procedura seguente presuppone che sia già stato creato un cluster e specificata una coppia di chiavi Amazon EC2. Per ulteriori informazioni su come iniziare a creare cluster, consulta [Nozioni di base su Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-gs) nella *Guida alla gestione di Amazon EMR*.

## Configura Hive per l'uso MapReduce
<a name="hive-mapreduce"></a>

Quando usi Hive su Amazon EMR per eseguire query sulle tabelle DynamoDB, possono verificarsi degli errori se Hive utilizza il motore di esecuzione di default, Tez. Per questo motivo, quando crei un cluster con Hive che si integra con DynamoDB come descritto in questa sezione, ti consigliamo di utilizzare una classificazione di configurazione che imposti Hive da utilizzare. MapReduce Per ulteriori informazioni, consulta [Configurazione delle applicazioni](emr-configure-apps.md).

Il seguente frammento mostra la classificazione della configurazione e la proprietà da utilizzare per impostare MapReduce come motore di esecuzione per Hive:

```
[
                {
                    "Classification": "hive-site",
                    "Properties": {
                        "hive.execution.engine": "mr"
                    }
                }
             ]
```<a name="EMR_Interactive_Hive_session"></a>

**Per eseguire i comandi Hive in modo interattivo**

1. Connettersi al nodo master. Per maggiori informazioni, consulta [Connessione al nodo master tramite SSH](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html) nella *Guida alla gestione di Amazon EMR*.

1. Nel prompt dei comandi per il nodo master corrente, digitare `hive`.

   Viene visualizzato un prompt hive: `hive>`

1.  Inserisci un comando Hive che mappi una tabella nell'applicazione Hive ai dati in DynamoDB. Questa tabella agisce come riferimento ai dati archiviati in Amazon DynamoDB: i dati non vengono memorizzati localmente in Hive e le query che utilizzano la tabella sono eseguite sui dati live in DynamoDB. Pertanto, la capacità di lettura o scrittura della tabella viene consumata ogni volta che viene eseguito un comando. Se è prevista l'esecuzione di più comandi Hive sullo stesso set di dati, valutare la possibilità di esportarli. 

    Di seguito è mostrata la sintassi per la mappatura di una tabella Hive a una tabella DynamoDB. 

   ```
   CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...)
   STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
   TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", 
   "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...");
   ```

    Le tabelle create in Hive da DynamoDB devono essere create come tabelle esterne utilizzando la parola chiave `EXTERNAL`. La differenza tra le tabelle interne ed esterne è che, nel primo caso, i dati vengono eliminati quando viene rimossa la tabella interna. In caso di connessione ad Amazon DynamoDB non si tratta di un comportamento ottimale, quindi sono supportate solo le tabelle esterne. 

    Ad esempio, il seguente comando Hive crea una tabella denominata *hivetable1* in Hive che fa riferimento alla tabella DynamoDB denominata *dynamodbtable1*. La *tabella* DynamoDB dynamodbtable1 ha uno schema a chiave primaria. hash-and-range L'elemento della chiave hash è `name` (tipo String), l'elemento della chiave di intervallo è `year` (tipo Numeric) e ciascuna voce ha un valore attributo per `holidays` (tipo String Set). 

   ```
   CREATE EXTERNAL TABLE hivetable1 (col1 string, col2 bigint, col3 array<string>)
   STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
   TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", 
   "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");
   ```

    La riga 1 usa l'istruzione HiveQL `CREATE EXTERNAL TABLE`. Per *hivetable1*, è necessario stabilire una colonna per ogni coppia nome-valore dell'attributo nella tabella DynamoDB e fornire il tipo di dati. Questi valori non prevedono distinzione fra maiuscole e minuscole ed è possibile dare alle colonne qualsiasi nome (eccetto le parole riservate). 

    La riga 2 usa l'istruzione `STORED BY`. Il valore di `STORED BY` è il nome della classe che gestisce la connessione tra Hive e DynamoDB. Deve essere impostato su `'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'`. 

    La riga 3 usa l'istruzione `TBLPROPERTIES` per associare "hivetable1" alla tabella e allo schema corretti in DynamoDB. Fornire `TBLPROPERTIES` con i valori per i parametri `dynamodb.table.name` e `dynamodb.column.mapping`. Per questi valori *è prevista* la distinzione tra maiuscole e minuscole.
**Nota**  
 Tutti i nomi di attributi DynamoDB per la tabella devono avere colonne corrispondenti nella tabella Hive. A seconda della versione di Amazon EMR in uso, se la one-to-one mappatura non esiste, si verificano i seguenti scenari:  
In Amazon EMR versione 5.27.0 e successive, il connettore dispone di convalide che garantiscono una mappatura one-to-one tra i nomi degli attributi DynamoDB e le colonne nella tabella Hive. Si verificherà un errore se la mappatura non esiste. one-to-one
In Amazon EMR 5.26.0 e versioni precedenti, la tabella Hive non contiene la coppia nome-valore proveniente da DynamoDB. Se non vengono mappati gli attributi della chiave primaria DynamoDB, Hive genera un errore. Se non vengono mappati gli attributi della chiave non primaria, non vengono generati errori, ma nella tabella Hive non saranno visualizzati i dati. Se i tipi di dati non corrispondono, il valore è null. 

A questo punto puoi iniziare a eseguire operazioni Hive su *hivetable1*. Le query eseguite per *hivetable1* vengono eseguite internamente nella tabella DynamoDB *dynamodbtable1* dell'account DynamoDB, consumando unità di lettura o scrittura a ogni esecuzione.

Quando esegui query Hive su una tabella DynamoDB, devi accertarti di aver assegnato una quantità sufficiente di unità di capacità di lettura.

Ad esempio, supponiamo che tu disponga di 100 unità di capacità di lettura assegnate per la tabella DynamoDB. Questo ti consentirà di eseguire 100 operazioni di lettura, o 409.600 byte, al secondo. Se la tabella contiene 20 GB di dati (21.474.836.480 byte) e la tua query Hive esegue una scansione completa della tabella, puoi stimare la durata dell'esecuzione della query:

 * 21.474.836.480 / 409.600 = 52.429 secondi = 14,56 ore * 

Il solo modo per ridurre il tempo necessario sarebbe modificare le unità di capacità di lettura nella tabella DynamoDB di origine. L'aggiunta di più nodi Amazon EMR non è utile.

Nell'output Hive, la percentuale di completamento viene aggiornata quando terminano uno o più processi del mappatore. Per una tabella DynamoDB di grandi dimensioni con una bassa capacità di lettura assegnata, l'output della percentuale di completamento potrebbe non essere aggiornato per molto tempo; in questo caso, il processo sembrerà essere completo allo 0% per diverse ore. Per uno stato più dettagliato dell'avanzamento del processo, accedi alla console di Amazon EMR, dalla quale potrai visualizzare lo stato delle singole attività del mappatore e statistiche per le letture di dati. Puoi anche accedere all'interfaccia Hadoop sul nodo master e vedere le statistiche di Hadoop. Ti sarà mostrato lo stato della singola attività del mappatore e alcune statistiche di lettura dei dati. Per ulteriori informazioni, consulta i seguenti argomenti:
+ [Interfacce Web ospitate sul nodo master](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-web-interfaces.html)
+ [Visualizzazione delle interfacce Web di Hadoop](https://docs.aws.amazon.com/emr/latest/ManagementGuide/UsingtheHadoopUserInterface.html)

Per ulteriori informazioni sulle istruzioni HiveQL di esempio per eseguire attività quali l'esportazione o l'importazione di dati da DynamoDB e unione di tabelle, consulta [Esempi di comandi Hive per l'esportazione, l'importazione e l'esecuzione di query sui dati in DynamoDB](EMR_Hive_Commands.md).<a name="EMR_Hive_Cancel"></a>

**Per annullare una richiesta Hive**

Quando esegui una query Hive, la risposta iniziale del server include il comando per annullare la richiesta. Per annullare la richiesta in qualsiasi momento del processo, utilizza il comando **Kill Command (Comando di chiusura)** dalla risposta del server.

1. Immettere `Ctrl+C` per chiudere il client a riga di comando.

1.  Al prompt della shell, immettere il comando **Kill Command (Comando di chiusura)** tratto dalla risposta iniziale del server alla richiesta. 

    In alternativa, è possibile eseguire il comando seguente dalla riga di comando del nodo master per terminare il processo Hadoop, dove si *job-id* trova l'identificatore del processo Hadoop e può essere recuperato dall'interfaccia utente Hadoop.

   ```
   hadoop job -kill job-id
   ```

## Tipi di dati per Hive e DynamoDB
<a name="EMR_Hive_Properties"></a>

La seguente tabella mostra i tipi di dati Hive disponibili, il tipo di DynamoDB predefinito a cui fanno riferimento e i tipi di DynamoDB alternativi a cui possono essere associati. 


| Tipo Hive | Tipo di DynamoDB predefinito | Tipo/i di DynamoDB alternativo/i | 
| --- | --- | --- | 
| stringa | string (S) |  | 
| bigint o double | number (N) |  | 
| binary | binary (B) |  | 
| booleano | boolean (BOOL) |  | 
| array | list (L) | number set (NS), string set (SS) o binary set (BS) | 
| map<string,string> | elemento | map (M) | 
| map<string,?> | map (M) |  | 
|  | null (NULL) |  | 

Se desideri scrivere i dati Hive come un tipo corrispondente di DynamoDB alternativo o se i dati di DynamoDB contengono valori di attributi di un tipo di DynamoDB alternativo, puoi specificare la colonna e il tipo di DynamoDB con il parametro `dynamodb.type.mapping`. L'esempio seguente mostra la sintassi per specificare una mappatura di tipi alternativi.

```
CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename",
"dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...",
"dynamodb.type.mapping" = "hive_column1_name:dynamodb_attribute1_datatype");
```

Il parametro della mappatura dei tipi è facoltativo e deve essere specificato solo per le colonne che utilizzano tipi alternativi.

Ad esempio, il seguente comando Hive crea una tabella denominata `hivetable2` che fa riferimento alla tabella `dynamodbtable2` di DynamoDB. È simile a `hivetable1`, tranne per il fatto che associa la colonna `col3` al tipo string set (SS). 

```
CREATE EXTERNAL TABLE hivetable2 (col1 string, col2 bigint, col3 array<string>)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable2",
"dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays",
"dynamodb.type.mapping" = "col3:SS");
```

In Hive, `hivetable1` e `hivetable2` sono identici. Tuttavia, quando i dati di tali tabelle vengono scritti nelle tabelle DynamoDB corrispondenti, `dynamodbtable1` contiene elenchi, mentre `dynamodbtable2` contiene set di stringhe.

Se desideri scrivere valori `null` di Hive come attributi del tipo `null` di DynamoDB, puoi farlo con il parametro `dynamodb.null.serialization`. L'esempio seguente mostra la sintassi per specificare la serializzazione `null`.

```
CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename",
"dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...",
"dynamodb.null.serialization" = "true");
```

Il parametro di serializzazione null è facoltativo e, se non specificato, è impostato su `false`. Nota che gli attributi `null` di DynamoDB sono letti come valori `null` in Hive indipendentemente dalle impostazioni del parametro. Le raccolte Hive con valori `null` possono essere scritte in DynamoDB solo se il parametro di serializzazione null è specificato come `true`. In caso contrario, si verifica un errore Hive.

Il tipo bigint in Hive è uguale al tipo long in Java, mentre il tipo double di Hive è uguale al tipo double in Java, in termini di precisione. Questo significa che, se disponi di dati numerici memorizzati in DynamoDB con una precisione superiore a quella disponibile nei tipi di dati Hive, l'utilizzo di Hive per esportare, importare o fare riferimento ai dati DynamoDB può portare a una perdita di precisione o a un errore nella query Hive. 

 Le esportazioni del tipo binary da DynamoDB ad Amazon Simple Storage Service (Amazon S3) o HDFS vengono memorizzate come una stringa con codifica Base64. Se importi dati da Amazon S3 o HDFS nel tipo binary di DynamoDB, assicurati che siano codificati come stringa Base64. 

## Opzioni Hive
<a name="EMR_Hive_Options"></a>

 Puoi impostare le seguenti opzioni di Hive per gestire il trasferimento di dati da Amazon DynamoDB. Queste opzioni persistono nella sessione di Hive corrente. Se chiudi il prompt dei comandi Hive e lo riapri in un secondo momento nel cluster, le impostazioni ritorneranno ai valori predefiniti. 


| Opzioni Hive | Description | 
| --- | --- | 
| dynamodb.throughput.read.percent |   Imposta la percentuale di operazioni di lettura per mantenere il tasso di velocità effettiva assegnato di DynamoDB nell'intervallo allocato per la tabella. Il valore è compreso tra `0.1` e `1.5` inclusi.   Il valore di 0,5 è la velocità di lettura di default, il che significa che Hive cercherà di consumare metà delle risorse di throughput assegnate alla lettura nella tabella. L'aumento del valore sopra a 0,5 aumenta la velocità della richiesta di lettura, che invece scende riducendo il valore sotto a 0,5. La velocità di lettura è approssimativa. La velocità di lettura reale varia in base a fattori come la presenza di una distribuzione uniforme delle chiavi in DynamoDB.   Se vedi che il throughput assegnato viene frequentemente superato dalle operazioni Hive, oppure se è il traffico live in lettura viene limitato eccessivamente, porta il valore sotto a `0.5`. Se disponi di capacità sufficiente e desideri operazioni Hive più veloci, imposta questo valore al di sopra di `0.5`. Se ritieni che non ci siano operazioni di input/output inutilizzate disponibili, puoi anche andare oltre impostando il valore fino a 1,5.   | 
| dynamodb.throughput.write.percent |   Imposta la percentuale di operazioni di scrittura per mantenere il tasso di velocità effettiva assegnato di DynamoDB nell'intervallo allocato per la tabella. Il valore è compreso tra `0.1` e `1.5` inclusi.   Il valore di 0,5 è la velocità di scrittura di default, il che significa che Hive cercherà di consumare metà delle risorse di throughput assegnate alla scrittura nella tabella. L'aumento del valore sopra a 0,5 aumenta la velocità delle richieste di scrittura, che invece scende riducendo il valore sotto a 0,5. La velocità di scrittura è approssimativa. La velocità di scrittura reale varia in base a fattori come la presenza di una distribuzione uniforme delle chiavi in DynamoDB.   Se vedi che il throughput assegnato viene frequentemente superato dalle operazioni Hive, oppure se è il traffico live in scrittura viene limitato eccessivamente, porta il valore sotto a `0.5`. Se disponi di capacità sufficiente e desideri operazioni Hive più veloci, imposta questo valore al di sopra di `0.5`. Puoi anche andare oltre impostando il valore fino a 1,5, se ritieni che non ci siano operazioni di input/output inutilizzate disponibili o se stai eseguendo il caricamento iniziale dei dati sulla tabella e non c'è ancora traffico live.   | 
| dynamodb.endpoint | Specifica l'endpoint per il servizio DynamoDB. Per ulteriori informazioni sugli endpoint DynamoDB disponibili, consulta la pagina relativa a [Regioni ed endpoint](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region).  | 
| dynamodb.max.map.tasks |   Specifica il numero massimo di attività di mappatura durante la lettura di dati da DynamoDB. Questo valore deve essere maggiore o uguale a 1.   | 
| dynamodb.retry.duration |   Specifica il numero di minuti da utilizzare come durata di timeout per rieseguire i comandi Hive. Questo valore deve essere un numero intero uguale o maggiore di 0. La durata di timeout predefinita è di due minuti.   | 

 Queste opzioni vengono impostate utilizzando il comando `SET` come mostrato nel seguente esempio. 

```
SET dynamodb.throughput.read.percent=1.0; 

INSERT OVERWRITE TABLE s3_export SELECT * 
FROM hiveTableName;
```