

 Amazon Redshift ne prendra plus en charge la création de nouveaux Python à UDFs partir du patch 198. UDFs Le Python existant continuera de fonctionner jusqu'au 30 juin 2026. Pour plus d’informations, consultez le [ billet de blog ](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

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.

# Intégration d'Amazon Redshift à Apache Spark
<a name="spark-redshift-connector"></a>

 [Apache Spark](https://aws.amazon.com/emr/features/spark/) est un modèle distribué de programmation et d'infrastructure qui vous permet d'effectuer des opérations de machine learning, de traitement de flux ou d'analyse graphique. De manière analogue à Apache Hadoop, Spark est un système de traitement distribué open source, couramment utilisé pour les charges de travail de big data. Spark dispose d'un moteur d'exécution optimisé de graphes orientés acycliques dirigés (DAG) et met activement en cache les données en mémoire. Cela peut améliorer les performances, en particulier pour certains algorithmes et requêtes interactives. 

 Cette intégration vous fournit un connecteur Spark que vous pouvez utiliser pour créer des applications Apache Spark qui lisent et écrivent des données dans Amazon Redshift et Amazon Redshift sans serveur. Ces applications ne compromettent pas les performances des applications ni la cohérence transactionnelle des données. Cette intégration est automatiquement incluse dans [Amazon EMR](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/) et [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/), ce qui vous permet d'exécuter immédiatement des tâches Apache Spark qui accèdent à des données et les chargent dans Amazon Redshift dans le cadre de vos pipelines d'ingestion et de transformation de données. 

Actuellement, vous pouvez utiliser les versions 3.3.x, 3.4.x, 3.5.x et 4.0.0 de Spark avec cette intégration.

 Cette intégration fournit les éléments suivants : 
+  Gestion des identités et des accès AWS Authentification (IAM). Pour plus d'informations, consultez [Identity and Access Management dans Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html). 
+ Pushdown des prédicats et des requêtes pour améliorer les performances.
+  Types de données Amazon Redshift. 
+ Connectivité à Amazon Redshift et Amazon Redshift sans serveur.

## Considérations et limites relatives à l'utilisation du connecteur Spark
<a name="spark-redshift-connector-considerations"></a>
+  L'URI tempdir pointe vers un emplacement Amazon S3. Ce répertoire temporaire n'est pas nettoyé automatiquement et peut entraîner des frais supplémentaires. Nous vous recommandons d'utiliser les [stratégies de cycle de vie d'Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) dans le *guide d'utilisation d'Amazon Simple Storage Service* pour définir les règles de conservation du compartiment Amazon S3. 
+  Par défaut, les copies entre Amazon S3 et Redshift ne fonctionnent pas si le compartiment S3 et le cluster Redshift se trouvent dans des régions différentes. AWS Pour utiliser AWS des régions distinctes, définissez le `tempdir_region` paramètre sur la région du compartiment S3 utilisé pour le`tempdir`.
+ Écritures entre régions entre S3 et Redshift en cas d'écriture de données Parquet à l'aide du paramètre `tempformat`.
+ Nous vous recommandons d'utiliser le [chiffrement côté serveur Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) pour chiffrer les compartiments Amazon S3 utilisés. 
+ Nous vous recommandons de [bloquer l'accès public aux compartiments Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html). 
+  Nous recommandons que le cluster Amazon Redshift ne soit pas accessible au public. 
+  Nous vous recommandons d'activer la [journalisation des audits Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html). 
+  Nous vous recommandons d'activer le [chiffrement au repos d'Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/security-server-side-encryption.html). 
+  Nous vous recommandons d'activer le protocole SSL pour la connexion JDBC entre Spark sur Amazon EMR et Amazon Redshift. 
+ Nous vous recommandons de transmettre un rôle IAM à l'aide du paramètre `aws_iam_role` pour le paramètre d'authentification Amazon Redshift.

# Authentification avec le connecteur Spark
<a name="redshift-spark-connector-authentication"></a>

Le schéma suivant décrit l'authentification entre Amazon S3, Amazon Redshift, le pilote Spark et les exécuteurs Spark.

![\[Voici un schéma de l'authentification du connecteur Spark.\]](http://docs.aws.amazon.com/fr_fr/redshift/latest/mgmt/images/spark-connector-authentication.png)


## Authentification entre Redshift et Spark
<a name="redshift-spark-authentication"></a>

 Vous pouvez utiliser le pilote JDBC version 2.x fourni par Amazon Redshift pour vous connecter à Amazon Redshift avec le connecteur Spark en spécifiant des informations d’identification. Pour utiliser IAM, [configurez votre URL JDBC pour utiliser l'authentification IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-iam-credentials-configure-jdbc-odbc.html). Pour vous connecter à un cluster Redshift depuis Amazon EMR ou AWS Glue assurez-vous que votre rôle IAM dispose des autorisations nécessaires pour récupérer les informations d'identification IAM temporaires. La liste suivante décrit toutes les autorisations dont votre rôle IAM a besoin pour récupérer des informations d'identification et exécuter des opérations Amazon S3. 
+ [Redshift : GetClusterCredentials](https://docs.aws.amazon.com/redshift/latest/APIReference/API_GetClusterCredentials.html) (pour les clusters Redshift provisionnés)
+ [Redshift : DescribeClusters](https://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusters.html) (pour les clusters Redshift provisionnés)
+ [Redshift : GetWorkgroup](https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_GetWorkgroup.html) (pour les groupes de travail Amazon Redshift Serverless)
+ [Redshift : GetCredentials](https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_GetCredentials.html) (pour les groupes de travail Amazon Redshift Serverless)
+ [s3 : ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html)
+ [s3 : GetBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucket.html)
+ [s3 : GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)
+ [s3 : PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [s3 : GetBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html)

 Pour plus d'informations sur GetClusterCredentials, consultez les [politiques IAM pour GetClusterCredentials](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#redshift-policy-resources.getclustercredentials-resources). 

Vous devez également vous assurer qu'Amazon Redshift peut assumer le rôle IAM pendant les opérations `COPY` et `UNLOAD`.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "redshift.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

Si vous utilisez le pilote JDBC le plus récent, le pilote gérera automatiquement la transition d'un certificat auto-signé Amazon Redshift vers un certificat ACM. Vous devez toutefois [spécifier les options SSL dans l'URL JDBC](https://docs.aws.amazon.com/redshift/latest/mgmt/jdbc20-configuration-options.html#jdbc20-ssl-option). 

 L'exemple suivant montre comment spécifier l'URL du pilote JDBC et le `aws_iam_role` pour se connecter à Amazon Redshift. 

```
df.write \
  .format("io.github.spark_redshift_community.spark.redshift ") \
  .option("url", "jdbc:redshift:iam://<the-rest-of-the-connection-string>") \
  .option("dbtable", "<your-table-name>") \
  .option("tempdir", "s3a://<your-bucket>/<your-directory-path>") \
  .option("aws_iam_role", "<your-aws-role-arn>") \
  .mode("error") \
  .save()
```

## Authentification entre Amazon S3 et Spark
<a name="spark-s3-authentication"></a>

 Si vous utilisez un rôle IAM pour vous authentifier entre Spark et Amazon S3, utilisez l'une des méthodes suivantes : 
+ Le AWS SDK for Java tentera automatiquement de AWS trouver des informations d'identification en utilisant la chaîne de fournisseurs d'informations d'identification par défaut implémentée par la AWSCredentials ProviderChain classe Default. Pour plus d'informations, consultez [Utilisation de la chaîne de fournisseur d'informations d'identification par défaut](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default).
+ Vous pouvez spécifier des AWS clés via les propriétés de [configuration de Hadoop](https://github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-aws/src/site/markdown/tools/hadoop-aws/index.md). Par exemple, si votre configuration `tempdir` pointe vers un système de fichiers `s3n://`, définissez les propriétés `fs.s3n.awsAccessKeyId` et `fs.s3n.awsSecretAccessKey` dans un fichier de configuration XML Hadoop ou appelez `sc.hadoopConfiguration.set()` pour modifier la configuration Hadoop globale de Spark.

Par exemple, si vous utilisez le système de fichiers s3n, ajoutez :

```
sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "YOUR_KEY_ID")
sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "YOUR_SECRET_ACCESS_KEY")
```

Pour le système de fichiers s3a, ajoutez :

```
sc.hadoopConfiguration.set("fs.s3a.access.key", "YOUR_KEY_ID")
sc.hadoopConfiguration.set("fs.s3a.secret.key", "YOUR_SECRET_ACCESS_KEY")
```

Si vous utilisez Python, effectuez les opérations suivantes :

```
sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", "YOUR_KEY_ID")
sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", "YOUR_SECRET_ACCESS_KEY")
```
+ Encodez les clés d'authentification dans l'URL `tempdir`. Par exemple, l'URI `s3n://ACCESSKEY:SECRETKEY@bucket/path/to/temp/dir` encode la paire de clés (`ACCESSKEY`, `SECRETKEY`).

## Authentification entre Redshift et Amazon S3
<a name="redshift-s3-authentication"></a>

 Si vous utilisez les commandes COPY et UNLOAD dans votre requête, vous devez également autoriser Amazon S3 à accéder à Amazon Redshift pour exécuter des requêtes en votre nom. Pour ce faire, [autorisez d'abord Amazon Redshift à accéder à d'autres AWS services](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html), puis autorisez les [opérations COPY et UNLOAD à l'aide des rôles IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html). 

Il est recommandé d’associer des politiques d’autorisation à un rôle IAM, puis de l’attribuer à des utilisateurs et à des groupes, le cas échéant. Pour plus d’informations, consultez [Identity and Access Management dans Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html).

## Intégration avec AWS Secrets Manager
<a name="redshift-secrets-manager-authentication"></a>

Vous pouvez récupérer vos informations d'identification de nom d'utilisateur et de mot de passe Redshift à partir d'un secret stocké dans AWS Secrets Manager. Pour fournir automatiquement les informations d'identification Redshift, utilisez le paramètre `secret.id`. Pour plus d'informations sur la création d'un secret d'informations d'identification Redshift, consultez [Création d'un secret de base de données AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_database_secret.html).

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/redshift/latest/mgmt/redshift-spark-connector-authentication.html)

**Note**  
 Remerciement : cette documentation contient des exemples de code et de langage développés par l’[Apache Software Foundation](http://www.apache.org/) dans le cadre de la [licence Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0). 

# Améliorations des performances grâce au pushdown
<a name="spark-redshift-connector-pushdown"></a>

 Le connecteur Spark applique automatiquement le pushdown des prédicats et des requêtes pour optimiser les performances. Cela signifie que si vous utilisez une fonction prise en charge dans votre requête, le connecteur Spark transformera la fonction en requête SQL et exécutera la requête dans Amazon Redshift. Cette optimisation permet de récupérer moins de données et Apache Spark peut donc traiter moins de données et obtenir de meilleures performances. Par défaut, le pushdown est automatiquement activé. Pour le désactiver, définissez `autopushdown` sur false. 

```
import sqlContext.implicits._val 
 sample= sqlContext.read
    .format("io.github.spark_redshift_community.spark.redshift")
    .option("url",jdbcURL )
    .option("tempdir", tempS3Dir)
    .option("dbtable", "event")
    .option("autopushdown", "false")
    .load()
```

 Les fonctions suivantes sont prises en charge avec le pushdown. Si vous utilisez une fonction qui ne figure pas dans cette liste, le connecteur Spark exécutera la fonction dans Spark au lieu d'Amazon Redshift, ce qui se traduira par des performances non optimisées. Pour obtenir la liste complète des fonctions de Spark, consultez [Built-in Functions](https://spark.apache.org/docs/latest/api/sql/index.html) (Fonctions intégrées). 
+ Fonctions d'agrégation
  + avg
  + count
  + max
  + min
  + sum
  + stddev\$1samp
  + stddev\$1pop
  + var\$1samp
  + var\$1pop
+ Opérateurs booléens
  + in
  + isnull
  + isnotnull
  + contient
  + endswith
  + startswith
+ Opérateurs logiques
  + and
  + or
  + not (ou \$1)
+ Fonctions mathématiques
  + \$1
  + -
  + \$1
  + /
  + - (unaire)
  + abs
  + acos
  + asin
  + atan
  + ceil
  + cos
  + exp
  + floor
  + greatest
  + least
  + log10
  + pi
  + pow
  + round
  + sin
  + sqrt
  + tan
+ Fonctions diverses
  + cast
  + coalesce
  + decimal
  + if
  + in
+ Opérateurs relationnels
  + \$1=
  + =
  + >
  + >=
  + <
  + <=
+ Fonctions de chaîne
  + ascii
  + lpad
  + rpad
  + translate
  + upper
  + lower
  + longueur
  + trim
  + ltrim
  + rtrim
  + like
  + substring
  + concat
+ Fonctions de date et d'heure
  + add\$1months
  + date
  + date\$1add
  + date\$1sub
  + date\$1trunc
  + timestamp
  + trunc
+ Operations mathématiques
  + CheckOverflow
  + PromotePrecision
+ Opérations relationnelles
  + Alias (par exemple, AS)
  + CaseWhen
  + Distinct
  + InSet
  + Jointures et jointures croisées
  + Restrictions
  + Unions, union all
  + ScalarSubquery
  + Sorts (par ordre croissant et décroissant)
  + UnscaledValue

# Autres options de configuration
<a name="spark-redshift-connector-other-config"></a>

Vous trouverez sur cette page des descriptions des options que vous pouvez spécifier pour le connecteur Amazon Redshift Spark.

## Taille maximale des colonnes de chaînes
<a name="spark-redshift-connector-other-config-max-size"></a>

Redshift crée des colonnes de chaîne sous forme de colonnes de texte lors de la création de tables, qui sont stockées en tant que VARCHAR(256). Si vous souhaitez que les colonnes prennent en charge de plus grandes tailles, vous pouvez utiliser maxlength pour spécifier la longueur maximale des colonnes de chaîne. Voici un exemple qui montre comment spécifier `maxlength`. 

```
columnLengthMap.foreach { case (colName, length) =>
  val metadata = new MetadataBuilder().putLong("maxlength", length).build()
  df = df.withColumn(colName, df(colName).as(colName, metadata))
}
```

## Type de colonne
<a name="spark-redshift-connector-other-config-column-type"></a>

Pour définir un type de colonne, utilisez le champ `redshift_type`.

```
columnTypeMap.foreach { case (colName, colType) =>
  val metadata = new MetadataBuilder().putString("redshift_type", colType).build()
  df = df.withColumn(colName, df(colName).as(colName, metadata))
}
```

## Encodage de compression dans une colonne
<a name="spark-redshift-connector-other-config-compression-encoding"></a>

 Pour utiliser un encodage de compression spécifique sur une colonne, utilisez le champ d'encodage. Pour obtenir la liste complète des encodages de compression pris en charge, consultez [Encodages de compression](https://docs.aws.amazon.com/redshift/latest/dg/c_Compression_encodings.html). 

## Description d’une colonne
<a name="spark-redshift-connector-other-config-description"></a>

Pour définir une description, utilisez le champ `description`.

## Authentification entre Redshift et Amazon S3
<a name="spark-redshift-connector-other-config-unload-as-text"></a>

 Par défaut, le résultat est déchargé sur Amazon S3 au format Parquet. Pour décharger le résultat sous forme de fichier texte séparé par une barre verticale, spécifiez l'option suivante. 

```
.option("unload_s3_format", "TEXT")
```

## Instructions pushdown
<a name="spark-redshift-connector-other-config-lazy-pushdown"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/redshift/latest/mgmt/spark-redshift-connector-other-config.html)

## Paramètres du connecteur
<a name="spark-redshift-connector-other-config-spark-parameters"></a>

La carte des paramètres ou `OPTIONS` dans Spark SQL prend en charge les paramètres suivants.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/redshift/latest/mgmt/spark-redshift-connector-other-config.html)

**Note**  
 Remerciement : cette documentation contient des exemples de code et de langage développés par l’[Apache Software Foundation](http://www.apache.org/) dans le cadre de la [licence Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0). 

# Types de données pris en charge
<a name="spark-redshift-connector-data-types"></a>

Les types de données suivants dans Amazon Redshift sont pris en charge par le connecteur Spark. Pour obtenir la liste complète des types de données pris en charge dans Amazon Redshift, consultez [Types de données](https://docs.aws.amazon.com//redshift/latest/dg/c_Supported_data_types.html). Si un type de données ne figure pas dans la table ci-dessous, il n'est pas pris en charge dans le connecteur Spark.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/redshift/latest/mgmt/spark-redshift-connector-data-types.html)

## Types de données complexes
<a name="spark-redshift-connector-complex-data-types"></a>

 Vous pouvez utiliser le connecteur Spark pour lire et écrire des types de données complexes Spark tels que `ArrayType`, `MapType` et `StructType` vers et depuis les colonnes de type de données Redshift SUPER. Si vous fournissez un schéma lors d'une opération de lecture, les données de la colonne sont converties dans les types complexes correspondants dans Spark, y compris les types imbriqués. De plus, si `autopushdown` est activé, la projection des attributs imbriqués, des valeurs de mappage et des indices de tableau est transférée vers Redshift afin qu'il ne soit plus nécessaire de décharger l'intégralité de la structure de données imbriquée lors de l'accès à une simple partie des données. 

Lorsque vous écrivez DataFrames depuis le connecteur, toute colonne de type `MapType` (utilisant`StringType`)`StructType`, ou `ArrayType` est écrite dans une colonne de type de données Redshift SUPER. Lors de l'écriture de ces structures de données imbriquées, le paramètre `tempformat` doit être de type `CSV`, `CSV GZIP` ou `PARQUET`. L'utilisation de `AVRO` provoquera une exception. L'écriture d'une structure de données `MapType` dont le type de clé est autre que `StringType` provoquera également une exception. 

### StructType
<a name="spark-redshift-connector-complex-data-types-examples-structtype"></a>

L'exemple suivant montre comment créer une table avec un type de données SUPER contenant une structure.

```
create table contains_super (a super);
```

Vous pouvez ensuite utiliser le connecteur pour interroger un champ `StringType` `hello` à partir de la colonne SUPER `a` dans la table en utilisant un schéma comme dans l'exemple suivant.

```
import org.apache.spark.sql.types._

val sc = // existing SparkContext
val sqlContext = new SQLContext(sc)

val schema = StructType(StructField("a", StructType(StructField("hello", StringType) ::Nil)) :: Nil)

val helloDF = sqlContext.read
.format("io.github.spark_redshift_community.spark.redshift")
.option("url", jdbcURL )
.option("tempdir", tempS3Dir)
.option("dbtable", "contains_super")
.schema(schema)
.load().selectExpr("a.hello")
```

L'exemple suivant montre comment écrire une structure dans la colonne `a`.

```
import org.apache.spark.sql.types._
import org.apache.spark.sql._

val sc = // existing SparkContext
val sqlContext = new SQLContext(sc)

val schema = StructType(StructField("a", StructType(StructField("hello", StringType) ::Nil)) :: Nil)
val data = sc.parallelize(Seq(Row(Row("world"))))
val mydf = sqlContext.createDataFrame(data, schema)

mydf.write.format("io.github.spark_redshift_community.spark.redshift").
option("url", jdbcUrl).
option("dbtable", tableName).
option("tempdir", tempS3Dir).
option("tempformat", "CSV").
mode(SaveMode.Append).save
```

### MapType
<a name="spark-redshift-connector-complex-data-types-examples-maptype"></a>

Si vous préférez utiliser `MapType` pour représenter vos données, vous pouvez utiliser une structure de données `MapType` dans votre schéma et récupérer la valeur correspondant à une clé dans le mappage. Notez que toutes les clés de votre structure de données `MapType` doivent être de type String et que toutes les valeurs doivent être du même type, par exemple int. 

L'exemple suivant montre comment obtenir la valeur de la clé `hello` dans la colonne `a`.

```
import org.apache.spark.sql.types._

val sc = // existing SparkContext
val sqlContext = new SQLContext(sc)

val schema = StructType(StructField("a", MapType(StringType, IntegerType))::Nil)

val helloDF = sqlContext.read
    .format("io.github.spark_redshift_community.spark.redshift")
    .option("url", jdbcURL )
    .option("tempdir", tempS3Dir)
    .option("dbtable", "contains_super")
    .schema(schema)
    .load().selectExpr("a['hello']")
```

### ArrayType
<a name="spark-redshift-connector-complex-data-types-examples-arraytype"></a>

Si la colonne contient un tableau à la place d'une structure, vous pouvez utiliser le connecteur pour interroger le premier élément du tableau.

```
import org.apache.spark.sql.types._

val sc = // existing SparkContext
val sqlContext = new SQLContext(sc)

val schema = StructType(StructField("a", ArrayType(IntegerType)):: Nil)

val helloDF = sqlContext.read
    .format("io.github.spark_redshift_community.spark.redshift")
    .option("url", jdbcURL )
    .option("tempdir", tempS3Dir)
    .option("dbtable", "contains_super")
    .schema(schema)
    .load().selectExpr("a[0]")
```

### Limitations
<a name="spark-redshift-connector-complex-data-types-limitations"></a>

L'utilisation de types de données complexes avec le connecteur Spark présente les limites suivantes :
+ Tous les noms des champs de structure imbriqués et les clés de mappage doivent être en minuscules. Si vous effectuez une requête pour obtenir les noms de champs complexes avec des lettres majuscules, vous pouvez essayer d'omettre le schéma et d'utiliser la fonction Spark `from_json` pour convertir la chaîne renvoyée localement comme solution de contournement.
+ Tous les champs de mappage utilisés dans les opérations de lecture et d'écriture doivent contenir uniquement des clés `StringType`.
+ Seuls `CSV`, `CSV GZIP` et `PARQUET ` sont des valeurs tempformat prises en charge pour l'écriture de types complexes dans Redshift. Une tentative d'utilisation de `AVRO ` lèvera une exception.