

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

# Accedi, esegui query e unisciti a tabelle Amazon DynamoDB utilizzando Athena
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena"></a>

*Moinul Al-Mamun, Amazon Web Services*

## Riepilogo
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-summary"></a>

Questo modello mostra come configurare una connessione tra Amazon Athena e Amazon DynamoDB utilizzando il connettore Amazon Athena DynamoDB. Il connettore utilizza una funzione AWS Lambda per interrogare i dati in DynamoDB. Non è necessario scrivere alcun codice per configurare la connessione. Una volta stabilita la connessione, è possibile accedere e analizzare rapidamente le tabelle DynamoDB utilizzando [Athena Federated Query per eseguire comandi SQL da Athena](https://docs.aws.amazon.com/athena/latest/ug/connect-to-a-data-source.html). Puoi anche unire una o più tabelle DynamoDB tra loro o con altre fonti di dati, come Amazon Redshift o Amazon Aurora.

## Prerequisiti e limitazioni
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-prereqs"></a>

**Prerequisiti**
+ Un account AWS attivo con autorizzazioni per gestire tabelle DynamoDB, sorgenti di dati Athena, Lambda e ruoli AWS Identity and Access Management (IAM)
+ Un bucket Amazon Simple Storage Service (Amazon S3) in cui Athena può archiviare i risultati delle query
+ Un bucket S3 in cui il connettore Athena DynamoDB può salvare i dati a breve termine
+ Una regione AWS che supporta la versione [2 del motore Athena](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0002.html)
+ Autorizzazioni IAM per accedere ad Athena e ai bucket S3 richiesti
+ [Connettore Amazon Athena DynamoDB](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb), installato

**Limitazioni**

L'interrogazione delle tabelle DynamoDB comporta un costo. Le dimensioni delle tabelle che superano alcuni gigabyte (GB) possono comportare costi elevati. Si consiglia di considerare i costi prima di eseguire qualsiasi operazione SCAN completa della tabella. Per ulteriori informazioni, consulta [Prezzi di Amazon DynamoDB](https://aws.amazon.com/dynamodb/pricing/). Per ridurre i costi e ottenere prestazioni elevate, si consiglia di utilizzare sempre LIMIT nella query (ad esempio,`SELECT * FROM table1 LIMIT 10`). Inoltre, prima di eseguire una query JOIN o GROUP BY in un ambiente di produzione, considerate le dimensioni delle tabelle. Se le tue tabelle sono troppo grandi, prendi in considerazione opzioni alternative come [la migrazione della tabella su Amazon](https://aws.amazon.com/blogs/database/simplify-amazon-dynamodb-data-extraction-and-analysis-by-using-aws-glue-and-amazon-athena/) S3.

## Architecture
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-architecture"></a>

Il diagramma seguente mostra come un utente può eseguire una query SQL su una tabella DynamoDB da Athena.

![Flusso di lavoro per connettere Athena e DynamoDB per eseguire una query SQL.](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/e6ff94af-d208-40c7-94e4-af257755a603/images/bc8e0132-b578-463b-bf55-3c39ce359c17.png)


Il diagramma mostra il flusso di lavoro seguente:

1. Per interrogare una tabella DynamoDB, un utente esegue una query SQL da Athena.

1. Athena avvia una funzione Lambda.

1. La funzione Lambda interroga i dati richiesti nella tabella DynamoDB.

1. DynamoDB restituisce i dati richiesti alla funzione Lambda. Quindi, la funzione trasferisce i risultati della query all'utente tramite Athena.

1. La funzione Lambda memorizza i dati nel bucket S3.

**Stack tecnologico**
+ Amazon Athena
+ Amazon DynamoDB
+ Simple Storage Service (Amazon S3)
+ AWS Lambda

## Tools (Strumenti)
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-tools"></a>
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html) è un servizio di query interattivo che ti aiuta ad analizzare i dati direttamente in Amazon S3 utilizzando SQL standard.
+ [Amazon Athena DynamoDB Connector](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb) è uno strumento AWS che consente ad Athena di connettersi a DynamoDB e accedere alle tabelle utilizzando query SQL.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) è un servizio di database NoSQL interamente gestito che offre prestazioni elevate, prevedibili e scalabili.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) è un servizio di elaborazione che ti aiuta a eseguire codice senza dover fornire o gestire server. Esegue il codice solo quando necessario e si ridimensiona automaticamente, quindi paghi solo per il tempo di calcolo che utilizzi.

## Epiche
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-epics"></a>

### Creare tabelle DynamoDB di esempio
<a name="create-sample-dynamodb-tables"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea la prima tabella di esempio.  | 1. Accedi alla Console di gestione AWS e apri la console [DynamoDB](https://console.aws.amazon.com/dynamodb/).<br />2. Scegliere **Create table (Crea tabella)**.<br />3. **Per il **nome della tabella**, inserisci dydbtable1.**<br />4. **Per la chiave di **partizione**, immettere PK1.******<br />5. **Per la **chiave di ordinamento**, inserisci SK1.**<br />6. Nella sezione **Impostazioni tabella**, scegli **Personalizza impostazioni**.<br />7. Nella sezione **Table class**, scegli **DynamoDB Standard**.<br />8. Nella sezione delle **impostazioni Read/write della capacità**, per la **modalità Capacità, scegli**. **On-demand**<br />9. Nella sezione **Encryption at rest**, scegli **Owned by Amazon DynamoDB**.<br />10. Scegliere **Create table (Crea tabella)**. | Developer | 
| Inserisci dati di esempio nella prima tabella. | 1. Aprire la [console DynamoDB](https://console.aws.amazon.com/dynamodb/).<br />2. Nel riquadro di navigazione, scegli **Tabella**, quindi scegli la tua tabella nella colonna **Nome**.<br />3. Scegli **Azioni**, quindi scegli **Crea elemento**.<br />4. Scegli la **visualizzazione JSON**.<br />5. Nella barra del titolo dell'editor **Attributi**, disattiva **View DynamoDB JSON**.<br />6. Nell'editor **Attributi**, inserisci i seguenti dati di esempio uno per uno:<pre>{<br />  "PK1": "1234",<br />  "SK1": "info",<br />  "Salary": "5000"<br /> }</pre><pre>{<br />  "PK1": "1235",<br />  "SK1": "info",<br />  "Salary": "5200"<br /> }</pre> | Developer | 
| Create la seconda tabella di esempio.  | 1. Aprire la [console DynamoDB](https://console.aws.amazon.com/dynamodb/).<br />2. Scegliere **Create table (Crea tabella)**.<br />3. Per **Nome tabella**, immettete **dydbtable2**.<br />4. **Per la chiave di **partizione**, immettere PK2.**<br />5. **Per la **chiave Sort**, inserisci SK2.**<br />6. Nella sezione **Impostazioni tabella**, scegli **Personalizza impostazioni**.<br />7. Nella sezione **Table class**, scegli **DynamoDB Standard**.<br />8. Nella sezione delle **impostazioni Read/write della capacità**, per la **modalità Capacità, scegli**. **On-demand**<br />9. Nella sezione **Encryption at rest**, scegli **Owned by Amazon DynamoDB**.<br />10. Scegliere **Create table (Crea tabella)**. | Developer | 
| Inserisci dati di esempio nella seconda tabella. | 1. Aprire la [console DynamoDB](https://console.aws.amazon.com/dynamodb/).<br />2. Nel riquadro di navigazione, scegli **Tabella**, quindi scegli la tua tabella nella colonna **Nome**.<br />3. Scegli **Azioni**, quindi scegli **Crea elemento**.<br />4. Nella barra del titolo dell'editor **Attributi**, disattiva **View DynamoDB JSON**.<br />5. Nell'editor **Attributi**, inserisci i seguenti dati di esempio uno per uno:<pre>{<br />  "PK2": "1234",<br /> "SK2": "bonus",<br /> "Bonus": "500"<br />}</pre><pre>{<br />  "PK2": "1235",<br /> "SK2": "bonus",<br /> "Bonus": "1000"<br />}</pre> | Developer | 

### Creare un'origine dati in Athena per DynamoDB
<a name="create-a-data-source-in-athena-for-dynamodb"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Configura il connettore di origine dati. | Crea un'origine dati per DynamoDB, quindi crea una funzione Lambda per connetterti a quell'origine dati.1. Accedi alla Console di gestione AWS e apri la console [Athena](https://console.aws.amazon.com/athena/).<br />2. Nel riquadro di navigazione, scegli **Origini dati**, quindi scegli **Crea origine dati**.<br />3. **Scegli l'origine dati **Amazon DynamoDB**, quindi scegli Avanti.**<br />4. **Nella sezione **Dettagli dell'origine dati**, per **Nome dell'origine dati**, inserisci TestDynamoDB.**<br />5. Nella sezione **Dettagli di connessione**, seleziona una funzione Lambda già distribuita o scegli Crea funzione **Lambda se non disponi di una funzione** Lambda da utilizzare per questo modello. **Nota**: per ulteriori informazioni sulla creazione di una funzione Lambda, consulta [Guida introduttiva a Lambda nella Lambda Developer](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html) Guide.<br />6. (Facoltativo) Se scegli la **funzione Create Lambda**, devi configurare il CloudFormation modello AWS incluso nell'applicazione Java prima di distribuire quello stack. Il modello include ApplicationName, SpillBucket AthenaCatalogName, e altre impostazioni dell'applicazione. **Nota**: dopo aver distribuito questa Java-based applicazione, lo stack crea una funzione Lambda che consente ad Athena di comunicare con DynamoDB. In questo modo le tabelle sono accessibili tramite comandi SQL.<br />7. Implementa la tua funzione Lambda.<br />8. Scegli **Next (Successivo)**. | Developer | 
| Verifica che la funzione Lambda possa accedere allo spill bucket S3. | 1. Aprire la [console Lambda](https://console.aws.amazon.com/lambda/).<br />2. Nel riquadro di navigazione, scegli **Funzioni**, quindi scegli la funzione che hai creato in precedenza.<br />3. Scegli la scheda **Configurazione**.<br />4. Nel riquadro di sinistra, scegli **Variabili di ambiente**, quindi conferma che il valore della chiave è`spill_bucket`.<br />5. Nel riquadro di sinistra, scegli **Autorizzazioni**, quindi nella sezione **Ruolo di esecuzione**, scegli il ruolo IAM associato. **Nota**: vieni indirizzato al ruolo IAM collegato alla tua funzione Lambda nella console IAM.<br />6. Conferma di avere l'autorizzazione di scrittura su `spill_bucket` bucket.Se riscontri errori, consulta la sezione *Informazioni aggiuntive* di questo schema come guida. | Developer | 

### Accedi alle tabelle DynamoDB da Athena
<a name="access-dynamodb-tables-from-athena"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Interroga le tabelle DynamoDB. | 1. Accedi alla Console di gestione AWS e apri la console [Athena](https://console.aws.amazon.com/athena/).<br />2. Nel riquadro di navigazione, scegli **Origini dati**, quindi scegli **Crea origine dati**.<br />3. Nel riquadro di navigazione, scegli **Query Editor (Editor della query)**.<br />4. Nella scheda **Editor**, nella sezione **Dati**, per **Origine dati**, scegli la tua fonte di dati per **Origine dati**.<br />5. Per **Database**, scegli il database.<br />6. Per Query 1, inserisci la seguente query: `SELECT * FROM dydbtable1 t1;`<br />7. Scegliete **Esegui**, quindi verificate l'output nella tabella.<br />8. Per Query 2, inserisci la seguente query: `SELECT * FROM dydbtable2 t2;`<br />9. Scegliete **Esegui**, quindi verificate l'output nella tabella. | Developer | 
| Unisci le due tabelle DynamoDB. | DynamoDB è un data store NoSQL e non supporta l'operazione di join SQL. Di conseguenza, è necessario eseguire un'operazione di join su due tabelle DynamoDB:1. Scegliete l'icona con il segno più per creare un'altra query.<br />2. Per Query 3, inserisci la seguente query:<pre>SELECT pk1, salary, bonus FROM dydbtable1 t1<br /> JOIN dydbtable2 t2 ON t1.pk1 = t2.pk2;</pre> | Developer | 

## Risorse correlate
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-resources"></a>
+ [Connettore Amazon Athena DynamoDB (](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb)AWS Labs)
+ [Interroga qualsiasi fonte di dati con la nuova query federata di Amazon Athena](https://aws.amazon.com/blogs/big-data/query-any-data-source-with-amazon-athenas-new-federated-query/) (AWS Big Data Blog)
+ [Riferimento alla versione del motore Athena](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference.html) (Athena User Guide)
+ [Semplifica l'estrazione e l'analisi dei dati di Amazon DynamoDB utilizzando AWS Glue e Amazon Athena (AWS](https://aws.amazon.com/blogs/database/simplify-amazon-dynamodb-data-extraction-and-analysis-by-using-aws-glue-and-amazon-athena/) Database Blog)

## Informazioni aggiuntive
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-additional"></a>

Se esegui una query in Athena con `spill_bucket` il `{bucket_name}/folder_name/` formato, puoi ricevere il seguente messaggio di errore:

```
"GENERIC_USER_ERROR: Encountered an exception[java.lang.RuntimeException] from your LambdaFunction[arn:aws:lambda:us-east-1:xxxxxx:function:testdynamodb] executed in context[retrieving meta-data] with message[You do NOT own the spill bucket with the name: s3://DOC-EXAMPLE-BUCKET/athena_dynamodb_spill_data/]
This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum  or contact customer support with Query Id: [query-id]"
```

Per risolvere questo errore, aggiorna la variabile di ambiente della funzione Lambda `spill_bucket` a`{bucket_name_only}`, quindi aggiorna la seguente policy Lambda IAM per l'accesso in scrittura ai bucket:

```
{
             "Action": [
                 "s3:GetObject",
                 "s3:ListBucket",
                 "s3:GetBucketLocation",
                 "s3:GetObjectVersion",
                 "s3:PutObject",
                 "s3:PutObjectAcl",
                 "s3:GetLifecycleConfiguration",
                 "s3:PutLifecycleConfiguration",
                 "s3:DeleteObject"
            ],
             "Resource": [
                 "arn:aws:s3:::spill_bucket",
                 "arn:aws:s3:::spill_bucket/*"
            ],
             "Effect": "Allow"
        }
```

In alternativa, puoi rimuovere il connettore di origine dati Athena creato in precedenza e ricrearlo utilizzando only for. `{bucket_name}` `spill_bucket`