

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

# Creazione di un cluster con Iceberg
<a name="emr-iceberg-use-cluster"></a>

Questa sezione include informazioni sull'utilizzo di Iceberg con Spark, Trino, Flink e Hive.

# Utilizza un cluster Iceberg con Spark
<a name="emr-iceberg-use-spark-cluster"></a>

A partire da Amazon EMR versione 6.5.0, puoi utilizzare Iceberg con il cluster Spark senza dover includere operazioni di bootstrap. Per Amazon EMR versione 6.4.0 e precedenti, puoi utilizzare un'operazione di bootstrap per preinstallare tutte le dipendenze necessarie.

In questo tutorial, lo utilizzerai AWS CLI per lavorare con Iceberg su un cluster Amazon EMR Spark. Per utilizzare la console per creare un cluster con Iceberg installato, segui la procedura illustrata in [Creazione di un data lake Apache Iceberg utilizzando Amazon Athena, Amazon EMR e AWS Glue](https://aws.amazon.com/blogs//big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/).

## Creazione di un cluster Iceberg
<a name="emr-iceberg-create-cluster"></a>

Puoi creare un cluster con Iceberg installato utilizzando Console di gestione AWS, the AWS CLI o l'API Amazon EMR. In questo tutorial, lo utilizzerai AWS CLI per lavorare con Iceberg su un cluster Amazon EMR. Per utilizzare la console per creare un cluster con Iceberg installato, segui la procedura illustrata in [Creazione di un data lake Apache Iceberg utilizzando Amazon Athena, Amazon EMR e AWS Glue](https://aws.amazon.com/blogs//big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/). 

Per utilizzare Iceberg su Amazon EMR con AWS CLI, crea innanzitutto un cluster con i seguenti passaggi. Per informazioni su come specificare la classificazione Iceberg utilizzando il AWS CLI, consulta o. [Fornisci una configurazione utilizzando AWS CLI quando crei un cluster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) [Fornitura di una configurazione utilizzando l'SDK Java per la creazione di un cluster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk)

1. Crea un file `configurations.json` con i seguenti contenuti:

   ```
   [{
       "Classification":"iceberg-defaults",
       "Properties":{"iceberg.enabled":"true"}
   }]
   ```

1. Quindi, crea un cluster con la seguente configurazione. Sostituisci il percorso del bucket Amazon S3 di esempio e l'ID della sottorete con i tuoi valori.

   ```
   aws emr create-cluster --release-label emr-6.5.0 \
   --applications Name=Spark \
   --configurations file://configurations.json \
   --region us-east-1 \
   --name My_Spark_Iceberg_Cluster \
   --log-uri s3://amzn-s3-demo-bucket/ \
   --instance-type m5.xlarge \
   --instance-count 2 \
   --service-role EMR_DefaultRole_V2 \ 
   --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef0
   ```

In alternativa, puoi creare un cluster Amazon EMR che include l'applicazione Spark e includere il file `/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar` come dipendenza JAR in un processo Spark. Per ulteriori informazioni, consulta [Invio di applicazioni](https://spark.apache.org/docs/latest/submitting-applications.html#submitting-applications).

Per includere il jar come dipendenza in un processo Spark, aggiungi la seguente proprietà di configurazione all'applicazione Spark:

```
--conf "spark.jars=/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar"
```

Per ulteriori informazioni sulle dipendenze dei processi Spark, consulta [Dependency Management](https://spark.apache.org/docs/latest/running-on-kubernetes.html#dependency-management) (Gestione delle dipendenze) nel documento di Apache Spark [Running Spark on Kubernetes](https://spark.apache.org/docs/latest/running-on-kubernetes.html) (Esecuzione di Spark su Kubernetes).

## Inizializzazione di una sessione Spark per Iceberg
<a name="emr-iceberg-initialize-spark-session"></a>

Negli esempi seguenti viene illustrato come avviare la shell interattiva Spark, utilizzare Spark submit o utilizzare Amazon EMR Notebooks per lavorare con Iceberg su Amazon EMR.

------
#### [ spark-shell ]

1. Connessione al nodo master tramite SSH Per ulteriori 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. Immettere il seguente comando per avviare la shell Spark. Per usare la PySpark shell, `spark-shell` sostituiscila con. `pyspark`

   ```
   spark-shell \
       --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
       --conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket/prefix/
       --conf spark.sql.catalog.my_catalog.type=glue \
       --conf spark.sql.defaultCatalog=my_catalog \
       --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

------
#### [ spark-submit ]

1. Connessione al nodo master tramite SSH Per ulteriori 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. Immettere il seguente comando per avviare la sessione Spark per Iceberg.

   ```
   spark-submit \
   --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
   --conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
   --conf spark.sql.catalog.my_catalog.type=glue \
   --conf spark.sql.defaultCatalog=my_catalog \
   --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
   ```

------
#### [ EMR Studio notebooks ]

Per inizializzare una sessione Spark utilizzando i notebook EMR Studio, configurare la sessione Spark utilizzando il comando magico `%%configure` sul tuo notebook Amazon EMR, come nell'esempio seguente. Per ulteriori informazioni, consulta [Utilizzo di EMR Notebooks magics](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-magics.html#emr-magics) nella *Guida alla gestione di Amazon EMR*.

```
%%configure -f{
"conf":{
    "spark.sql.catalog.my_catalog":"org.apache.iceberg.spark.SparkCatalog",
    "spark.sql.catalog.my_catalog.type":"glue",
    "spark.sql.catalog.my_catalog.warehouse":"s3://amzn-s3-demo-bucket1/prefix/",
    "spark.sql.defaultCatalog":"my_catalog",
    "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
}
```

------
#### [ CLI ]

Per inizializzare un cluster Spark utilizzando la CLI e impostare tutte le configurazioni predefinite della sessione Spark Iceberg, esegui il seguente esempio. Per ulteriori informazioni su come specificare una classificazione di configurazione utilizzando l' AWS CLI API Amazon EMR, [consulta](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html) Configurare le applicazioni.

```
[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.sql.catalog.my_catalog":"org.apache.iceberg.spark.SparkCatalog",
      "spark.sql.catalog.my_catalog.type":"glue",
      "spark.sql.catalog.my_catalog.warehouse":"s3://amzn-s3-demo-bucket1/prefix/",
      "spark.sql.defaultCatalog":"my_catalog",
      "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
  }
]
```

------

## Scrittura su una tabella Iceberg
<a name="emr-iceberg-write-to-table"></a>

L'esempio seguente mostra come creare DataFrame e scrivere un set di dati Iceberg. In questa sezione, gli esempi illustrano l'utilizzo di set di dati con la Spark shell connessi al nodo master utilizzando SSH come utente hadoop predefinito.

**Nota**  
Per incollare gli esempi di codice nella shell Spark, digitare `:paste` al prompt, incollare l'esempio e premere `CTRL+D`.

------
#### [ PySpark ]

Spark include anche una shell basata su Python, `pyspark`, che puoi utilizzare per realizzare prototipi di programmi Spark scritti in Python. Richiama `pyspark` sul nodo principale.

```
## Create a DataFrame.
data = spark.createDataFrame([
 ("100", "2015-01-01", "2015-01-01T13:51:39.340396Z"),
 ("101", "2015-01-01", "2015-01-01T12:14:58.597216Z"),
 ("102", "2015-01-01", "2015-01-01T13:51:40.417052Z"),
 ("103", "2015-01-01", "2015-01-01T13:51:40.519832Z")
],["id", "creation_date", "last_update_time"])

## Write a DataFrame as a Iceberg dataset to the Amazon S3 location.
spark.sql("""CREATE TABLE IF NOT EXISTS dev.db.iceberg_table (id string,
creation_date string,
last_update_time string)
USING iceberg
location 's3://amzn-s3-demo-bucket/example-prefix/db/iceberg_table'""")

data.writeTo("dev.db.iceberg_table").append()
```

------
#### [ Scala ]

```
import org.apache.spark.sql.SaveMode
import org.apache.spark.sql.functions._

// Create a DataFrame.
val data = Seq(
("100", "2015-01-01", "2015-01-01T13:51:39.340396Z"),
("101", "2015-01-01", "2015-01-01T12:14:58.597216Z"),
("102", "2015-01-01", "2015-01-01T13:51:40.417052Z"),
("103", "2015-01-01", "2015-01-01T13:51:40.519832Z")
).toDF("id", "creation_date", "last_update_time")

// Write a DataFrame as a Iceberg dataset to the Amazon S3 location.
spark.sql("""CREATE TABLE IF NOT EXISTS dev.db.iceberg_table (id string,
creation_date string,
last_update_time string)
USING iceberg
location 's3://amzn-s3-demo-bucket/example-prefix/db/iceberg_table'""")

data.writeTo("dev.db.iceberg_table").append()
```

------

## Lettura da una tabella Iceberg
<a name="emr-iceberg-read-from-table"></a>

------
#### [ PySpark ]

```
df = spark.read.format("iceberg").load("dev.db.iceberg_table")
df.show()
```

------
#### [ Scala ]

```
val df = spark.read.format("iceberg").load("dev.db.iceberg_table")
df.show()
```

------
#### [ Spark SQL ]

```
SELECT * from dev.db.iceberg_table LIMIT 10
```

------

## Utilizzo di AWS Glue Data Catalog con Spark Iceberg
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Puoi connetterti a AWS Glue Data Catalog da Spark Iceberg. Questa sezione mostra diversi comandi per la connessione.

### Connect al catalogo AWS Glue predefinito nella regione predefinita
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Questo esempio mostra come effettuare la connessione utilizzando il tipo di catalogo Glue. Se non specificate un ID del catalogo, viene utilizzato il valore predefinito:

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
    --conf spark.sql.catalog.my_catalog.type=glue \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

### Connect a un catalogo AWS Glue con un ID di catalogo specifico
<a name="emr-iceberg-glue-catalog-config-spark"></a>

Questo esempio mostra come connettersi utilizzando un ID di catalogo:

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
    --conf spark.sql.catalog.my_catalog.type=glue \
    --conf spark.sql.catalog.my_catalog.glue.id=AWS Glue catalog ID \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

Questo comando può essere utilizzato per connettersi a un catalogo AWS Glue in un account diverso, a un catalogo RMS o a un catalogo federato.

## Usare Iceberg REST Catalog (IRC) con Spark Iceberg
<a name="emr-iceberg-rest-catalog-config"></a>

Le sezioni che seguono spiegano in dettaglio come configurare l'integrazione di Iceberg con un catalogo.

### Connect all' AWS endpoint IRC di Glue Data Catalog
<a name="emr-iceberg-rest-catalog-config-gdc"></a>

Quanto segue mostra un `spark-submit` comando di esempio per usare Iceberg REST:

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=glue catalog ID \
    --conf spark.sql.catalog.my_catalog.type=rest \
    --conf spark.sql.catalog.my_catalog.uri=glue endpoint URI/iceberg \
    --conf spark.sql.catalog.my_catalog.rest.sigv4-enabled=true \
    --conf spark.sql.catalog.my_catalog.rest.signing-name=glue \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

Per utilizzarlo su un cluster abilitato al runtime-role, sono necessarie le seguenti impostazioni di configurazione aggiuntive di Spark:

```
"spark.hadoop.fs.s3.credentialsResolverClass": "software.amazon.glue.GlueTableCredentialsResolver",
"spark.hadoop.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
"spark.hadoop.glue.id": glue catalog ID
"spark.hadoop.glue.endpoint": "glue endpoint"
```

Per l'elenco degli URL degli endpoint AWS Glue per ogni regione, vedi [AWS Glue endpoints e quote](https://docs.aws.amazon.com/general/latest/gr/glue.html).

### Connect a un endpoint IRC arbitrario
<a name="emr-iceberg-rest-catalog-config-arbitrary"></a>

Quanto segue mostra un `spark-submit` comando di esempio per l'utilizzo di un endpoint IRC:

```
spark-submit \
    --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.my_catalog.warehouse=warehouse name \
    --conf spark.sql.catalog.my_catalog.type=rest \
    --conf spark.sql.catalog.my_catalog.uri=your rest endpoint \
    --conf spark.sql.defaultCatalog=my_catalog \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

## Differenze di configurazione quando si utilizza Iceberg rispetto a SparkCatalog SparkSessionCatalog
<a name="emr-iceberg-spark-catalog"></a>

Iceberg offre due modi per creare cataloghi Spark Iceberg. Puoi impostare la configurazione di Spark su uno o su. `SparkCatalog` `SparkSessionCatalog` 

### Usare Iceberg SparkCatalog
<a name="emr-iceberg-spark-catalog-spark-catalog"></a>

Di seguito viene illustrato il comando da utilizzare **SparkCatalog**come catalogo Spark Iceberg:

```
spark-shell \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.defaultCatalog=my_catalog
```

Considerazioni relative a questo approccio:
+ Puoi accedere alle tabelle Iceberg ma non ad altre tabelle.
+ Il nome del catalogo non può essere **spark\$1catalog**. Questo è il nome del catalogo iniziale in Spark. Si collega sempre a un metastore Hive. È il catalogo predefinito in Spark, a meno che l'utente non lo sovrascriva utilizzando. `spark.sql.defaultCatalog`
+ Puoi impostare il `spark.sql.defaultCatalog` nome del tuo catalogo per renderlo il catalogo predefinito.

### Usare Iceberg SparkSessionCatalog
<a name="emr-iceberg-spark-catalog-spark-session"></a>

Di seguito viene illustrato il comando da utilizzare **SparkSessionCatalog**come catalogo Spark Iceberg:

```
spark-shell \
    --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \
    --conf spark.sql.catalog.spark_catalog.warehouse=s3://amzn-s3-demo-bucket1/prefix \
    --conf spark.sql.catalog.spark_catalog.type=glue
```

Considerazioni relative a questo approccio:
+ Se una tabella non viene trovata come tabella Iceberg, Spark proverà a vedere se si tratta di una tabella nel metastore Hive. Per ulteriori informazioni, vedere [Utilizzo del AWS Glue Data Catalog come catalogo per Hive](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html).
+ Il nome del catalogo deve essere **spark\$1catalog**.

## Utilizzo delle estensioni Iceberg Spark
<a name="emr-iceberg-spark-catalog-extensions"></a>

Iceberg offre l'estensione Spark `org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions` che gli utenti possono impostare tramite la configurazione delle estensioni Spark. `spark.sql.extensions` Le estensioni abilitano le funzionalità chiave di Iceberg come DELETE, UPDATE e MERGE a livello di riga, le istruzioni e le procedure del linguaggio di definizione dei dati Spark specifiche di Iceberg, come compattazione, scadenza delle istantanee, ramificazione e tagging e così via. Per maggiori dettagli, consulta quanto segue:
+ [Estensioni di scrittura Iceberg Spark: Spark Writes](https://iceberg.apache.org/docs/nightly/spark-writes/)
+ [Estensioni Iceberg Spark DDL: estensioni SQL ALTER TABLE](https://iceberg.apache.org/docs/nightly/spark-ddl/#alter-table-sql-extensions/)
+ [Estensioni della procedura Iceberg Spark: Spark Procedures](https://iceberg.apache.org/docs/nightly/spark-ddl/#alter-table-sql-extensions/)

## Considerazioni sull'utilizzo di Iceberg con Spark
<a name="spark-considerations-catalog"></a>
+ Per impostazione predefinita Amazon EMR 6.5.0 non supporta Iceberg in esecuzione su Amazon EMR su EKS. È disponibile un'immagine personalizzata di Amazon EMR 6.5.0 che ti consente di passare `--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar` come parametro `spark-submit` per creare tabelle Iceberg in Amazon EMR su EKS. Per ulteriori informazioni, consulta [Invio di un carico di lavoro Spark in Amazon EMR utilizzando un'immagine personalizzata](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-steps.html#docker-custom-images-submit) nella *Guida per gli sviluppatori di Amazon EMR su EKS*. Puoi anche contattare Supporto per ricevere assistenza. A partire da Amazon EMR 6.6.0, Iceberg è supportato in Amazon EMR su EKS.
+ Quando usi AWS Glue come catalogo per Iceberg, assicurati che il database in cui stai creando una tabella esista in AWS Glue. Se utilizzi servizi come AWS Lake Formation e non riesci a caricare il catalogo, assicurati di avere un accesso adeguato al servizio per eseguire il comando.
+ Se usi Iceberg SparkSessionCatalog, come descritto in[Differenze di configurazione quando si utilizza Iceberg rispetto a SparkCatalog SparkSessionCatalog](#emr-iceberg-spark-catalog), devi seguire i passaggi di configurazione descritti in Configure [AWS Glue Data Catalog come metastore Apache Hive, oltre a configurare le](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html) impostazioni di Spark Iceberg Glue Data Catalog. AWS 

# Utilizza un cluster Iceberg con Trino
<a name="emr-iceberg-use-trino-cluster"></a>

A partire da Amazon EMR versione 6.6.0, puoi utilizzare Iceberg con il cluster Trino. 

In questo tutorial, lo utilizzerai AWS CLI per lavorare con Iceberg su un cluster Amazon EMR Trino. Per utilizzare la console per creare un cluster con Iceberg installato, segui la procedura illustrata in [Creazione di un data lake Apache Iceberg utilizzando Amazon Athena, Amazon EMR e AWS Glue](https://aws.amazon.com/blogs//big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/).

## Creazione di un cluster Iceberg
<a name="emr-iceberg-create-cluster-trino"></a>

Per utilizzare Iceberg su Amazon EMR con AWS CLI, crea innanzitutto un cluster con i seguenti passaggi. Per informazioni su come specificare la classificazione Iceberg utilizzando il AWS CLI, consulta o. [Fornisci una configurazione utilizzando AWS CLI quando crei un cluster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) [Fornitura di una configurazione utilizzando l'SDK Java per la creazione di un cluster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk)

1. Crea un `configurations.json` file con il seguente contenuto. Ad esempio, se desideri utilizzare il metastore Hive come catalogo, il file deve avere il seguente contenuto.

   ```
   [
     {
       "Classification": "trino-connector-iceberg",
       "Properties": {
         "connector.name": "iceberg",
         "hive.metastore.uri": "thrift://localhost:9083"
       }
     }
   ]
   ```

   Se desideri utilizzare il AWS Glue Data Catalog come negozio, il file deve avere il seguente contenuto.

   ```
   [
     {
       "Classification": "trino-connector-iceberg",
       "Properties": {
         "connector.name": "iceberg",
         "iceberg.catalog.type": "glue"
       }
     }
   ]
   ```

   A partire da Amazon EMR 7.7.0, includi la proprietà *fs.native-s3.enabled=true*

   ```
   [
     { 
       "Classification": "trino-connector-iceberg",
       "Properties": {
         "connector.name": "iceberg",
         "iceberg.catalog.type": "glue",
         "fs.native-s3.enabled": "true"
       }           
     }                 
   ]
   ```

1. Crea un cluster con la seguente configurazione, sostituendo il percorso del bucket e il nome chiave di esempio di Amazon S3 con i tuoi.

   ```
   aws emr create-cluster --release-label emr-6.7.0 \
   --applications Name=Trino \
   --region us-east-1 \
   --name My_Trino_Iceberg_Cluster \
   --log-uri s3://amzn-s3-demo-bucket \
   --configurations file://configurations.json \
   --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=c3.4xlarge InstanceGroupType=CORE,InstanceCount=3,InstanceType=c3.4xlarge \ 
   --use-default-roles \
   --ec2-attributes KeyName=<key-name>
   ```

## Inizializzazione di una sessione Trino per Iceberg
<a name="emr-iceberg-initialize-trino"></a>

Per inizializzare una sessione Trino, esegui il comando riportato di seguito.

```
trino-cli --catalog iceberg
```

## Scrittura su una tabella Iceberg
<a name="emr-iceberg-write-to-table-trino"></a>

Crea e scrivi nella tabella con i comando SQL seguenti.

```
trino> SHOW SCHEMAS;
trino> CREATE TABLE default.iceberg_table (
            id int,
            data varchar,
            category varchar)
       WITH (
            format = 'PARQUET',
            partitioning = ARRAY['category', 'bucket(id, 16)'],
            location = 's3://amzn-s3-demo-bucket/<prefix>')
          
trino> INSERT INTO default.iceberg_table VALUES (1,'a','c1'), (2,'b','c2'), (3,'c','c3');
```

## Leggi da una tabella Iceberg
<a name="emr-iceberg-read-from-table-trino"></a>

Per leggere dalla tabella Iceberg, esegui il comando seguente.

```
trino> SELECT * from default.iceberg_table;
```

## Considerazioni sull'utilizzo di Iceberg con Trino
<a name="trino-considerations"></a>
+ Amazon EMR 6.5 non offre il supporto del Catalogo Trino Iceberg per Iceberg in modo nativo. Trino necessita di Iceberg v0.11, quindi ti consigliamo di avviare un cluster Amazon EMR diverso per Trino dal cluster Spark e di includere Iceberg v0.11 su tale cluster.
+ Quando usi AWS Glue come catalogo per Iceberg, assicurati che il database in cui stai creando una tabella esista in AWS Glue. Se utilizzi servizi come AWS Lake Formation e non riesci a caricare il catalogo, assicurati di avere accesso adeguato al servizio per eseguire il comando.
+ L'integrazione di Iceberg Glue non funziona con il catalogo Redshift Managed Storage.

# Utilizzo di un cluster Iceberg con Flink
<a name="emr-iceberg-use-flink-cluster"></a>

A partire dalla versione 6.9.0 di Amazon EMR, puoi utilizzare Iceberg con un cluster Flink senza i passaggi di configurazione necessari quando si utilizza l'integrazione open source di Iceberg per Flink.

## Creazione di un cluster Iceberg
<a name="creating-iceberg-cluster"></a>

Puoi creare un cluster con Iceberg installato utilizzando la Console di gestione AWS, la AWS CLI o l'API di Amazon EMR. In questo tutorial, lo utilizzerai AWS CLI per lavorare con Iceberg su un cluster Amazon EMR. Per utilizzare la console per creare un cluster con Iceberg installato, segui la procedura illustrata in [Creazione di un data lake Apache Iceberg utilizzando Amazon Athena, Amazon EMR e AWS Glue](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/).

Per utilizzare Iceberg su Amazon EMR con AWS CLI, crea innanzitutto un cluster con i seguenti passaggi. Per informazioni su come specificare la classificazione Iceberg utilizzando il AWS CLI, consulta o. [Fornisci una configurazione utilizzando AWS CLI quando crei un cluster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) [Fornitura di una configurazione utilizzando l'SDK Java per la creazione di un cluster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk) Crea un file denominato `configurations.json` con i seguenti contenuti:

```
[{
"Classification":"iceberg-defaults",
    "Properties":{"iceberg.enabled":"true"}
}]
```

Quindi, crea un cluster con la seguente configurazione, sostituendo il percorso del bucket Amazon S3 di esempio e l'ID della sottorete con i tuoi valori:

```
aws emr create-cluster --release-label emr-6.9.0 \
--applications Name=Flink \
--configurations file://iceberg_configurations.json \
--region us-east-1 \
--name My_flink_Iceberg_Cluster \
--log-uri s3://amzn-s3-demo-bucket/ \
--instance-type m5.xlarge \
--instance-count 2 \
--service-role EMR_DefaultRole \ 
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef
```

In alternativa, puoi creare un cluster Amazon EMR 6.9.0 che include l'applicazione Flink e utilizza il file `/usr/share/aws/iceberg/lib/iceberg-flink-runtime.jar` come dipendenza JAR in un processo Flink.

## Utilizzo del client Flink SQL
<a name="using-flink-sql-client"></a>

Lo script SQL Client si trova in `/usr/lib/flink/bin`. Puoi eseguire lo script con il comando seguente:

```
flink-yarn-session -d # starting the Flink YARN Session in detached mode
./sql-client.sh
```

Questa operazione avvia una shell (interprete di comandi) Flink SQL.

## Esempi di Flink
<a name="flink-examples"></a>

### Creazione di una tabella Iceberg
<a name="create-iceberg-table"></a>

**Flink SQL**

```
CREATE CATALOG glue_catalog WITH (
   'type'='iceberg',
   'warehouse'='<WAREHOUSE>',
   'catalog-impl'='org.apache.iceberg.aws.glue.GlueCatalog',
    'io-impl'='org.apache.iceberg.aws.s3.S3FileIO'
 );

USE CATALOG  glue_catalog;

CREATE DATABASE IF NOT EXISTS <DB>;

USE <DB>;

CREATE TABLE IF NOT EXISTS `glue_catalog`.`<DB>`.`sample` (id int, data string);
```

**Tabella API**

```
EnvironmentSettings settings =
                EnvironmentSettings.newInstance().inBatchMode().build();

TableEnvironment tEnv = TableEnvironment.create(settings);

String warehouse = "<WAREHOUSE>";
String db = "<DB>";

tEnv.executeSql(
                "CREATE CATALOG glue_catalog WITH (\n"
                        + "   'type'='iceberg',\n"
                        + "   'warehouse'='"
                        + warehouse
                        + "',\n"
                        + "   'catalog-impl'='org.apache.iceberg.aws.glue.GlueCatalog',\n"
                        + "   'io-impl'='org.apache.iceberg.aws.s3.S3FileIO'\n"
                        + " );");

tEnv.executeSql("USE CATALOG  glue_catalog;");
tEnv.executeSql("CREATE DATABASE IF NOT EXISTS " + db + ";");
tEnv.executeSql("USE " + db + ";");
tEnv.executeSql(
        "CREATE TABLE `glue_catalog`.`" + db + "`.`sample` (id bigint, data string);");
```

### Scrittura su una tabella Iceberg
<a name="write-to-iceberg-table"></a>

**Flink SQL**

```
INSERT INTO `glue_catalog`.`<DB>`.`sample` values (1, 'a'),(2,'b'),(3,'c');
```

**Tabella API**

```
tEnv.executeSql(
        "INSERT INTO `glue_catalog`.`"
                + db
                + "`.`sample` values (1, 'a'),(2,'b'),(3,'c');");
```

**API del flusso di dati**

```
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

final StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

String db = "<DB Name>";

String warehouse = "<Warehouse Path>";

GenericRowData rowData1 = new GenericRowData(2);
rowData1.setField(0, 1L);
rowData1.setField(1, StringData.fromString("a"));

DataStream<RowData> input = env.fromElements(rowData1);

Map<String, String> props = new HashMap<();
props.put("type", "iceberg");
props.put("warehouse", warehouse);
props.put("io-impl", "org.apache.iceberg.aws.s3.S3FileIO");

CatalogLoader glueCatlogLoader =
        CatalogLoader.custom(
                "glue",
                props,
                new Configuration(),
                "org.apache.iceberg.aws.glue.GlueCatalog");

TableLoader tableLoader =
        TableLoader.fromCatalog(glueCatlogLoader, TableIdentifier.of(db, "sample"));

DataStreamSink<Void> dataStreamSink =
        FlinkSink.forRowData(input).tableLoader(tableLoader).append();

env.execute("Datastream Write");
```

### Lettura da una tabella Iceberg
<a name="read-from-iceberg-table"></a>

**Flink SQL**

```
SELECT * FROM `glue_catalog`.`<DB>`.`sample`;
```

**Tabella API**

```
Table result = tEnv.sqlQuery("select * from `glue_catalog`.`" + db + "`.`sample`;");
```

**API del flusso di dati**

```
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

final StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

String db = "<DB Name>";

String warehouse = "<Warehouse Path>";

Map<String, String> props = new HashMap<>();
props.put("type", "iceberg");
props.put("warehouse", warehouse);
props.put("io-impl", "org.apache.iceberg.aws.s3.S3FileIO");

CatalogLoader glueCatlogLoader =
        CatalogLoader.custom(
                "glue",
                props,
                new Configuration(),
                "org.apache.iceberg.aws.glue.GlueCatalog");
                
TableLoader tableLoader =
        TableLoader.fromCatalog(glueCatlogLoader, TableIdentifier.of(db, "sample"));

DataStream<RowData> batch =
                FlinkSource.forRowData().env(env).tableLoader(tableLoader).streaming(false).build();

batch.print().name("print-sink");
```

## Utilizzo del catalogo Hive
<a name="using-hive-catalog"></a>

Assicurati che le dipendenze di Flink e Hive siano risolte come descritto in [Configurazione di Flink con Hive Metastore e Catalogo Glue](flink-configure.md#flink-configure-hive).

## Esecuzione di un processo Flink
<a name="running-flink-job"></a>

Un modo per inviare un processo a Flink consiste nell'utilizzare una sessione YARN per il processo Flink. Puoi eseguire l'avvio tramite il comando seguente:

```
sudo flink run -m yarn-cluster -p 4 -yjm 1024m -ytm 4096m $JAR_FILE_NAME
```

## Considerazioni sull'utilizzo di Iceberg con Flink
<a name="flink-considerations"></a>
+ Quando usi AWS Glue come catalogo per Iceberg, assicurati che il database in cui stai creando una tabella esista in AWS Glue. Se utilizzi servizi come AWS Lake Formation e non riesci a caricare il catalogo, assicurati di avere un accesso adeguato al servizio per eseguire il comando.
+ L'integrazione di Iceberg Glue non funziona con il catalogo Redshift Managed Storage.

# Utilizzo di un cluster Iceberg con Hive
<a name="emr-iceberg-use-hive-cluster"></a>

Con le versioni 6.9.0 e successive di Amazon EMR, puoi utilizzare Iceberg con un cluster Hive senza dover eseguire i passaggi di configurazione necessari per l'integrazione open source di Iceberg per Hive. Per Amazon EMR versione 6.8.0 e precedenti, puoi utilizzare un'operazione di bootstrap per installare jar `iceberg-hive-runtime` al fine di configurare Hive per il supporto di Iceberg.

Amazon EMR 6.9.0 include tutte le funzionalità per [l'integrazione di Hive 3.1.3 con Iceberg 0.14.1](https://iceberg.apache.org/releases/#0140-release) e include inoltre funzionalità aggiuntive di Amazon EMR come la selezione automatica dei motori di esecuzione supportati in fase di runtime (Amazon EMR su EKS 6.9.0).

## Creazione di un cluster Iceberg
<a name="create-iceberg-cluster"></a>

Puoi creare un cluster con Iceberg installato utilizzando Console di gestione AWS, the AWS CLI o l'API Amazon EMR. In questo tutorial, lo utilizzerai AWS CLI per lavorare con Iceberg su un cluster Amazon EMR. Per utilizzare la console al fine di creare un cluster con Iceberg installato, segui la procedura illustrata in [Creazione di un data lake Iceberg utilizzando Amazon Athena, Amazon EMR e AWS Glue](https://aws.amazon.com/blogs/big-data/build-an-apache-iceberg-data-lake-using-amazon-athena-amazon-emr-and-aws-glue/).

Per utilizzare Iceberg su Amazon EMR con, per prima cosa crea un cluster seguendo AWS CLI la procedura riportata di seguito. Per informazioni su come specificare la classificazione Iceberg utilizzando AWS CLI o l'SDK Java, consulta o. [Fornisci una configurazione utilizzando AWS CLI quando crei un cluster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-cli) [Fornitura di una configurazione utilizzando l'SDK Java per la creazione di un cluster](emr-configure-apps-create-cluster.md#emr-configure-apps-create-cluster-sdk) Crea un file denominato `configurations.json` con i seguenti contenuti:

```
[{
    "Classification":"iceberg-defaults",
    "Properties":{"iceberg.enabled":"true"}
}]
```

Quindi, crea un cluster con la seguente configurazione, sostituendo il percorso del bucket Amazon S3 di esempio e l'ID della sottorete con i tuoi valori:

```
aws emr create-cluster --release-label emr-6.9.0 \
--applications Name=Hive \
--configurations file://iceberg_configurations.json \
--region us-east-1 \
--name My_hive_Iceberg_Cluster \
--log-uri s3://amzn-s3-demo-bucket/ \
--instance-type m5.xlarge \
--instance-count 2 \
--service-role EMR_DefaultRole \ 
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-1234567890abcdef
```

Il cluster Hive Iceberg è in grado di eseguire le seguenti operazioni:
+ Caricare il jar di runtime di Iceberg Hive in Hive e abilitare la configurazione relativa a Iceberg per il motore Hive.
+ Abilitare la selezione dinamica del motore di esecuzione di Amazon EMR Hive per impedire agli utenti di impostare il motore di esecuzione supportato per la compatibilità con Iceberg.

**Nota**  
I cluster Hive Iceberg attualmente non supportano AWS Glue Data Catalog. Il catalogo Iceberg predefinito è `HiveCatalog`, che corrisponde al metastore configurato per l'ambiente Hive. Per ulteriori informazioni sulla gestione del catalogo, consulta [Utilizzo HCatalog](https://cwiki.apache.org/confluence/display/Hive/HCatalog+UsingHCat#HCatalogUsingHCat-UsingHCatalog) nella documentazione di [Apache](https://cwiki.apache.org/confluence/display/HIVE) Hive.

## Supporto funzionalità
<a name="feature-support"></a>

Amazon EMR 6.9.0 supporta Hive 3.1.3 e Iceberg 0.14.1. Il supporto delle funzionalità è limitato alle funzioni compatibili con Iceberg per Hive 3.1.2 e 3.1.3. Sono supportati i seguenti comandi:
+ Con le versioni da 6.9.0 a 6.12.x di Amazon EMR , devi includere il jar `libfb303` nella directory Hive `auxlib`. Utilizza il comando seguente per includerlo:

  ```
  sudo /usr/bin/ln -sf /usr/lib/hive/lib/libfb303-*.jar /usr/lib/hive/auxlib/libfb303.jar
  ```

  Con le versioni 6.13 e successive di Amazon EMR, il jar `libfb303` viene automaticamente collegato simbolicamente alla directory Hive `auxlib`. 
+ **Creazione di una tabella**
  + **Tabella non partizionata**: è possibile creare tabelle esterne in Hive fornendo il gestore di archiviazione come segue:

    ```
    CREATE EXTERNAL TABLE x (i int) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    ```
  + **Tabella partizionata**: è possibile creare tabelle partizionate esterne in Hive nel modo seguente:

    ```
    CREATE EXTERNAL TABLE x (i int) PARTITIONED BY (j int) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
    ```
**Nota**  
Il formato di `STORED AS` file di non ORC/AVRO/PARQUET è supportato in Hive 3. L'unica opzione predefinita è Parquet.
+ **Eliminazione di una tabella**: il comando `DROP TABLE` viene utilizzato per eliminare tabelle, come nell'esempio seguente:

  ```
  DROP TABLE [IF EXISTS] table_name [PURGE];
  ```
+ **Lettura di una tabella**: le istruzioni `SELECT` possono essere utilizzate per leggere le tabelle Iceberg in Hive, come nell'esempio seguente. I motori di esecuzione supportati sono MR e Tez.

  ```
  SELECT * FROM table_name
  ```

  [Per informazioni sulla sintassi select di Hive, consulta Select. LanguageManual ](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select) Per informazioni sulle istruzioni selezionate con tabelle Iceberg in Hive, consulta [Apache Iceberg Select](https://iceberg.apache.org/docs/latest/hive/#select).
+ **Inserimento in una tabella**: l'istruzione `INSERT INTO` di HiveQL funziona solo su tabelle Iceberg con supporto per il motore di esecuzione Map Reduce. Gli utenti di Amazon EMR non devono impostare esplicitamente il motore di esecuzione dal momento che Amazon EMR Hive lo seleziona automaticamente in fase di runtime. 
  + **Inserimento di una singola tabella**. Esempio:

    ```
    INSERT INTO table_name VALUES ('a', 1);
    INSERT INTO table_name SELECT...;
    ```
  + **Inserimento di più tabelle**: sono supportati gli inserimenti multi-tabella non atomici nelle istruzioni. Esempio:

    ```
    FROM source
     INSERT INTO table_1 SELECT a, b
     INSERT INTO table_2 SELECT c,d;
    ```

A partire da Amazon EMR 7.3.0, Hive with Iceberg supporta il AWS Glue Data Catalog come metastore. Per utilizzare il AWS Glue Data Catalog come metastore, impostate la seguente proprietà.

```
SET iceberg.catalog.<catalog_name>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog;
```

In alternativa, potete anche impostare la seguente proprietà.

```
SET iceberg.catalog.<catalog_name>.type=glue;
```

È quindi possibile creare una tabella utilizzando l'esempio seguente.

```
CREATE EXTERNAL TABLE table_name (col1 type1, col2 type2,..)
ROW FORMAT SERDE 'org.apache.iceberg.mr.hive.HiveIcebergSerDe'
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
location '<location>'
TBLPROPERTIES ('table_type'='iceberg', 'iceberg.catalog'='<catalog_name>');
```

## Considerazioni sull'utilizzo di Iceberg con Hive
<a name="hive-considerations"></a>
+ Iceberg supporta i seguenti tipi di query:
  + Creare una tabella
  + Drop table (Elimina tabella)
  + Insert into table (Inserisci in tabella)
  + Read table (Leggi tabella)
+ Solo il motore di esecuzione MR (MapReduce) è supportato per le operazioni DML (data manipulation language) e MR è obsoleto in Hive 3.1.3.
+ Per Amazon EMR precedenti alla 7.3.0, AWS Glue Data Catalog non è attualmente supportato per Iceberg with Hive.
+ La gestione degli errori non è sufficientemente robusta. In caso di configurazione errata, gli inserimenti nelle query potrebbero essere completati correttamente. Tuttavia, il mancato aggiornamento dei metadati può causare la perdita di dati.
+ L'integrazione di Iceberg Glue non funziona con il catalogo Redshift Managed Storage.