

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Prise en charge du format de tableau ouvert
<a name="emr-lf-fgac1"></a>

Les versions 6.15.0 et supérieures d'Amazon EMR incluent la prise en charge d'un contrôle d'accès précis basé sur les tables Hive, Apache Iceberg, Apache Hudi et Delta Lake lorsque vous lisez et écrivez des données AWS Lake Formation avec Spark SQL. Amazon EMR prend en charge le contrôle d’accès au niveau des tables, des lignes, des colonnes et des cellules avec Apache Hudi. Les versions 6.15.0 et ultérieures d'Amazon EMR incluent la prise en charge d'un contrôle d'accès précis au niveau des lignes, des colonnes ou des cellules en fonction de Lake Formation. AWS Depuis EMR 7.12, les opérations DML et DDL qui modifient les données des tables sont prises en charge pour les tables Apache Hive, Apache Iceberg et Delta Lake à l'aide des informations d'identification vendues par Lake Formation. 

Les rubriques de cette section expliquent comment accéder aux tables enregistrées dans Lake Formation dans des formats de tables ouvertes à partir de jobs EMR Spark ou de sessions interactives avec un contrôle d'accès précis.

## Conditions d'autorisation
<a name="emr-lf-perm"></a>

### Tables non enregistrées dans AWS Lake Formation
<a name="emr-lf-tbl-reg"></a>

Pour les tables non enregistrées auprès de Amazon S3 AWS Lake Formation, le rôle d'exécution des tâches accède à la fois au catalogue de données AWS Glue et aux données des tables sous-jacentes. Cela nécessite que le rôle d'exécution des tâches dispose des autorisations IAM appropriées pour les opérations AWS Glue et Amazon S3. 

### Tables enregistrées dans AWS Lake Formation
<a name="emr-lf-tbl-not-reg"></a>

Pour les tables enregistrées auprès de AWS Lake Formation, le rôle d'exécution du job accède aux métadonnées du catalogue de données AWS Glue, tandis que les informations d'identification temporaires fournies par Lake Formation accèdent aux données des tables sous-jacentes dans Amazon S3. Les autorisations de Lake Formation requises pour exécuter une opération dépendent du catalogue de données AWS Glue et des appels d'API Amazon S3 lancés par la tâche Spark et peuvent être résumées comme suit :
+ L'**autorisation** DESCRIBE permet au rôle d'exécution de lire les métadonnées d'une table ou d'une base de données dans le catalogue de données
+ L'autorisation **ALTER** permet au rôle d'exécution de modifier les métadonnées d'une table ou d'une base de données dans le catalogue de données
+ L'autorisation **DROP** permet au rôle d'exécution de supprimer les métadonnées de table ou de base de données du catalogue de données
+ L'autorisation **SELECT** permet au rôle d'exécution de lire les données des tables depuis Amazon S3
+ L'autorisation **INSERT** permet au rôle d'exécution d'écrire des données de table sur Amazon S3
+ L'autorisation **DELETE** permet au rôle d'exécution de supprimer les données de table d'Amazon S3
**Note**  
Lake Formation évalue les autorisations de manière paresseuse lorsqu'une tâche Spark appelle AWS Glue pour récupérer les métadonnées des tables et Amazon S3 pour récupérer les données des tables. Les tâches qui utilisent un rôle d'exécution avec des autorisations insuffisantes n'échoueront pas tant que Spark n'aura pas AWS passé un appel à Glue ou Amazon S3 nécessitant l'autorisation manquante.

**Note**  
Dans la matrice de tableau prise en charge suivante :   
Les opérations marquées comme **Supported** utilisent exclusivement les informations d'identification de Lake Formation pour accéder aux données des tables enregistrées auprès de Lake Formation. Si les autorisations de Lake Formation sont insuffisantes, l'opération ne se basera pas sur les informations d'identification du rôle d'exécution. Pour les tables non enregistrées auprès de Lake Formation, les informations d'identification du rôle d'exécution du travail accèdent aux données de la table.
Les opérations marquées comme étant **prises en charge avec des autorisations IAM sur le site Amazon S3** n'utilisent pas les informations d'identification de Lake Formation pour accéder aux données des tables sous-jacentes dans Amazon S3. Pour exécuter ces opérations, le rôle d'exécution des tâches doit disposer des autorisations Amazon S3 IAM nécessaires pour accéder aux données de la table, que la table soit enregistrée ou non auprès de Lake Formation.

------
#### [ Hive ]

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/emr/latest/ManagementGuide/emr-lf-fgac1.html)

------
#### [ Iceberg ]

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/emr/latest/ManagementGuide/emr-lf-fgac1.html)

**Configuration Spark pour Iceberg :** si vous souhaitez utiliser le format Iceberg, définissez les configurations suivantes. `DB_LOCATION`Remplacez-le par le chemin Amazon S3 où se trouvent vos tables Iceberg, et remplacez les espaces réservés à la région et à l'ID de compte par vos propres valeurs.

```
spark-sql \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog 
--conf spark.sql.catalog.spark_catalog.warehouse=s3://DB_LOCATION
--conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog 
--conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO
--conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.glue.id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.client.region=AWS_REGION
```

Si vous souhaitez utiliser le format Iceberg sur les versions antérieures d'EMR, utilisez plutôt la commande suivante :

```
spark-sql \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension  
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkCatalog 
--conf spark.sql.catalog.spark_catalog.warehouse=s3://DB_LOCATION
--conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog 
--conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO  
--conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.glue.id=ACCOUNT_ID
--conf spark.sql.catalog.spark_catalog.client.assume-role.region=AWS_REGION
--conf spark.sql.catalog.spark_catalog.lf.managed=true
```

**Exemples :**

Voici quelques exemples d'utilisation des tables Iceberg :

```
-- Create an Iceberg table
CREATE TABLE my_iceberg_table (
    id BIGINT,
    name STRING,
    created_at TIMESTAMP
) USING ICEBERG;

-- Insert data
INSERT INTO my_iceberg_table VALUES (1, 'Alice', current_timestamp());

-- Query the table
SELECT * FROM my_iceberg_table;
```

------
#### [ Hudi ]

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/emr/latest/ManagementGuide/emr-lf-fgac1.html)

**Configuration de Spark pour Hudi :**

Pour démarrer le shell Spark sur EMR 7.10 ou version ultérieure, utilisez la commande suivante :

```
spark-sql
--jars /usr/lib/hudi/hudi-spark-bundle.jar \
--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog \
--conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension
```

Pour démarrer le shell Spark sur des versions antérieures d'EMR, utilisez plutôt la commande ci-dessous :

```
spark-sql
--jars /usr/lib/hudi/hudi-spark-bundle.jar \
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer \
--conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog \
--conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension  \
--conf spark.sql.catalog.spark_catalog.lf.managed=true
```

**Exemples :**

Voici quelques exemples d'utilisation des tables Hudi :

```
-- Create a Hudi table
CREATE TABLE my_hudi_table (
    id BIGINT,
    name STRING,
    created_at TIMESTAMP
) USING HUDI
TBLPROPERTIES (
    'type' = 'cow',
    'primaryKey' = 'id'
);

-- Insert data
INSERT INTO my_hudi_table VALUES (1, 'Alice', current_timestamp());

-- Query the latest snapshot
SELECT * FROM my_hudi_table;
```

Pour demander le dernier instantané des copy-on-write tables :

```
SELECT * FROM my_hudi_cow_table
```

```
spark.read.table("my_hudi_cow_table")
```

Pour interroger les dernières données compactées des tables `MOR`, vous pouvez interroger la table optimisée en lecture qui est suffixée par `_ro` :

```
SELECT * FROM my_hudi_mor_table_ro
```

```
spark.read.table("my_hudi_mor_table_ro")
```

------
#### [ Delta Lake ]

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/emr/latest/ManagementGuide/emr-lf-fgac1.html)

**Configuration de Spark pour Delta Lake :**

Pour utiliser Delta Lake with Lake Formation sur EMR 7.10 ou version ultérieure, exécutez la commande suivante :

```
spark-sql \
   --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \
  --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog
```

Pour utiliser le lac Delta avec Lake Formation sur EMR 6,15 à 7,9, procédez comme suit

```
spark-sql \
  --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension \
  --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \
  --conf spark.sql.catalog.spark_catalog.lf.managed=true
```

Si vous souhaitez que Lake Formation utilise un serveur d'enregistrement pour gérer votre catalogue Spark, définissez `spark.sql.catalog.<managed_catalog_name>.lf.managed` ce paramètre sur true.

**Exemples :**

Voici quelques exemples d'utilisation des tables Delta Lake :

```
-- Create a Delta Lake table
CREATE TABLE my_delta_table (
    id BIGINT,
    name STRING,
    created_at TIMESTAMP
) USING DELTA;

-- Insert data
INSERT INTO my_delta_table VALUES (1, 'Alice', current_timestamp());

-- Query the table
SELECT * FROM my_delta_table;

-- Update data
UPDATE my_delta_table SET name = 'Alice Smith' WHERE id = 1;

-- Merge data
MERGE INTO my_delta_table AS target
USING (SELECT 2 as id, 'Bob' as name, current_timestamp() as created_at) AS source
ON target.id = source.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;
```

**Création d'une table Delta Lake dans AWS Glue Data Catalog**

Amazon EMR with Lake Formation ne prend pas en charge les commandes DDL ni la création de tables Delta dans les versions d'EMR antérieures à 7.12. Procédez comme suit pour créer des tables dans le catalogue de données AWS Glue.

1. Utilisez l'exemple suivant pour créer une table Delta. Assurez-vous que votre emplacement S3 existe.

   ```
   spark-sql \
   --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" \
   --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog"
   
   > CREATE DATABASE if not exists <DATABASE_NAME> LOCATION 's3://<S3_LOCATION>/transactionaldata/native-delta/<DATABASE_NAME>/';
   > CREATE TABLE <TABLE_NAME> (x INT, y STRING, z STRING) USING delta;
   > INSERT INTO <TABLE_NAME> VALUES (1, 'a1', 'b1');
   ```

1. Pour consulter les détails de votre tableau, rendez-vous sur [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/).

1. Dans le volet de navigation de gauche, développez le **catalogue de données**, choisissez **Tables**, puis choisissez la table que vous avez créée. Sous **Schema**, vous devriez voir que la table Delta que vous avez créée avec Spark stocke toutes les colonnes dans un type de `array<string>` données tel que AWS Glue.

1. Pour définir des filtres au niveau des colonnes et des cellules dans Lake Formation, supprimez la `col` colonne de votre schéma, puis ajoutez les colonnes figurant dans le schéma de votre table. Dans cet exemple, ajoutez les colonnes `x``y`, et`z`.

------

Grâce à cette fonctionnalité, vous pouvez exécuter des requêtes instantanées sur copy-on-write des tables pour demander le dernier instantané de la table à un instant de validation ou de compactage donné. Actuellement, un cluster Amazon EMR compatible avec Lake Formation doit récupérer la colonne de temps de validation de Hudi pour effectuer des requêtes incrémentielles et des requêtes de voyage dans le temps. Il ne prend pas en charge la `timestamp as of` syntaxe et la `Spark.read()` fonction de Spark. La syntaxe correcte est`select * from table where _hoodie_commit_time <= point_in_time`. Pour plus d'informations, voir [Requêtes ponctuelles sur le voyage dans le temps sur la table Hudi](https://cwiki.apache.org/confluence/display/HUDI/RFC+-+07+%3A+Point+in+time+Time-Travel+queries+on+Hudi+table).

**Note**  
Les performances des lectures sur les clusters de Lake Formation peuvent être plus lentes en raison d'optimisations non prises en charge. Ces fonctionnalités incluent la liste des fichiers basée sur les métadonnées Hudi et le saut de données. Nous vous recommandons de tester les performances de votre application pour vous assurer qu’elle répond à vos exigences.