

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.

# Utilisation du format CSV dans AWS Glue
<a name="aws-glue-programming-etl-format-csv-home"></a>

AWS Glue récupère les données des sources et écrit les données sur des cibles stockées et transportées dans différents formats de données. Si vos données sont stockées ou transportées au format CSV, ce document présente les fonctionnalités disponibles pour utiliser vos données dans AWS Glue. 

 AWS Glue prend en charge l'utilisation du format CSV (valeurs séparées par des virgules). Il s'agit d'un format de données minimal basé sur des lignes. CSVs ne sont souvent pas strictement conformes à une norme, mais vous pouvez vous référer aux [RFC 4180 et RFC](https://tools.ietf.org/html/rfc4180) [7111](https://tools.ietf.org/html/rfc7111) pour plus d'informations. 

Vous pouvez utiliser AWS Glue pour lire CSVs depuis Amazon S3 et depuis des sources de streaming, ainsi que CSVs pour écrire sur Amazon S3. Vous pouvez lire et écrire des archives `bzip` et `gzip` contenant des fichiers CSV provenant de S3. Vous configurez le comportement de compression sur [Paramètres de connexion S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3) plutôt que dans la configuration décrite sur cette page. 

Le tableau suivant indique les fonctionnalités courantes de AWS Glue compatibles avec l'option de format CSV.


| Lecture | Écrire | Lecture en streaming | Groupement des petits fichiers | Signets de tâche | 
| --- | --- | --- | --- | --- | 
| Pris en charge | Pris en charge | Pris en charge | Pris en charge | Pris en charge | 

## Exemple : lecture de fichiers ou de dossiers CSV depuis S3
<a name="aws-glue-programming-etl-format-csv-read"></a>

 **Prérequis :** vous aurez besoin des chemins S3 (`s3path`) vers des fichiers ou dossiers CSV que vous souhaitez lire. 

 **Configuration :** dans vos options de fonction, spécifiez `format="csv"`. Dans vos `connection_options`, utilisez la clé `paths` pour spécifier `s3path`. Vous pouvez configurer la manière dont le lecteur interagit avec S3 dans `connection_options`. Pour plus de détails, voir Types de connexion et options pour l'ETL dans AWS Glue :[Paramètres de connexion S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3). Vous pouvez configurer la manière dont le lecteur interprète les fichiers CSV dans votre `format_options`. Pour plus d'informations, consultez [CSV Configuration Reference](#aws-glue-programming-etl-format-csv-reference) (Référence de configuration CSV). 

Le script AWS Glue ETL suivant montre le processus de lecture de fichiers ou de dossiers CSV à partir de S3.

 Nous fournissons un lecteur CSV personnalisé avec des optimisations de performances pour les flux de travail courants à travers la clé de configuration `optimizePerformance`. Pour déterminer si ce lecteur est adapté à votre charge de travail, consultez [Optimiser les performances de lecture avec un lecteur CSV SIMD vectorisé](#aws-glue-programming-etl-format-simd-csv-reader). 

------
#### [ Python ]

Pour cet exemple, utilisez la méthode [create\_dynamic\_frame.from\_options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-create_dynamic_frame_from_options).

```
# Example: Read CSV from S3
# For show, we handle a CSV with a header row.  Set the withHeader option.
# Consider whether optimizePerformance is right for your workflow.

from pyspark.context import SparkContext
from awsglue.context import GlueContext

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

dynamicFrame = glueContext.create_dynamic_frame.from_options(
    connection_type="s3",
    connection_options={"paths": ["s3://{{s3path}}"]},
    format="csv",
    format_options={
        "withHeader": True,
        # "optimizePerformance": True,
    },
)
```

Vous pouvez également l'utiliser DataFrames dans un script (`pyspark.sql.DataFrame`).

```
dataFrame = spark.read\
    .format("csv")\
    .option("header", "true")\
    .load("s3://{{s3path}}")
```

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

Pour cet exemple, utilisez l'opération [getSourceWithFormat](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-getSourceWithFormat).

```
// Example: Read CSV from S3
// For show, we handle a CSV with a header row.  Set the withHeader option.
// Consider whether optimizePerformance is right for your workflow.

import com.amazonaws.services.glue.util.JsonOptions
import com.amazonaws.services.glue.{DynamicFrame, GlueContext}
import org.apache.spark.SparkContext

object GlueApp {
  def main(sysArgs: Array[String]): Unit = {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)
    
    val dynamicFrame = glueContext.getSourceWithFormat(
      formatOptions=JsonOptions("""{"withHeader": true}"""),
      connectionType="s3",
      format="csv",
      options=JsonOptions("""{"paths": ["s3://{{s3path}}"], "recurse": true}""")
    ).getDynamicFrame()
  }
}
```

Vous pouvez également l'utiliser DataFrames dans un script (`org.apache.spark.sql.DataFrame`).

```
val dataFrame = spark.read
  .option("header","true")
  .format("csv")
  .load("s3://{{s3path}}“)
```

------

## Exemple : écriture de fichiers et dossiers CSV dans S3
<a name="aws-glue-programming-etl-format-csv-write"></a>

 **Prérequis :** Vous aurez besoin d'un initialisé DataFrame (`dataFrame`) ou d'un DynamicFrame (`dynamicFrame`). Vous aurez également besoin de votre chemin de sortie S3, `s3path`. 

 **Configuration :** dans vos options de fonction, spécifiez `format="csv"`. Dans vos `connection_options`, utilisez la clé `paths` pour spécifier `s3path`. Vous pouvez configurer la manière dont le scripteur interagit avec S3 dans `connection_options`. Pour plus de détails, voir Types de connexion et options pour l'ETL dans AWS Glue :[Paramètres de connexion S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3). Vous pouvez configurer la manière dont votre opération écrit le contenu de vos fichiers dans `format_options`. Pour plus d'informations, consultez [CSV Configuration Reference](#aws-glue-programming-etl-format-csv-reference) (Référence de configuration CSV). Le script ETL AWS Glue suivant montre le processus d'écriture de fichiers et dossiers CSV vers S3. 

------
#### [ Python ]

Pour cet exemple, utilisez la méthode [write\_dynamic\_frame.from\_options](aws-glue-api-crawler-pyspark-extensions-glue-context.md#aws-glue-api-crawler-pyspark-extensions-glue-context-write_dynamic_frame_from_options).

```
# Example: Write CSV to S3
# For show, customize how we write string type values.  Set quoteChar to -1 so our values are not quoted.

from pyspark.context import SparkContext
from awsglue.context import GlueContext

sc = SparkContext.getOrCreate()
glueContext = GlueContext(sc)

glueContext.write_dynamic_frame.from_options(
    frame=dynamicFrame,
    connection_type="s3",
    connection_options={"path": "s3://{{s3path}}"},
    format="csv",
    format_options={
        "quoteChar": -1,
    },
)
```

Vous pouvez également l'utiliser DataFrames dans un script (`pyspark.sql.DataFrame`).

```
dataFrame.write\
    .format("csv")\
    .option("quote", None)\
    .mode("append")\
    .save("s3://{{s3path}}")
```

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

Pour cet exemple, utilisez la méthode [getSinkWithFormat](glue-etl-scala-apis-glue-gluecontext.md#glue-etl-scala-apis-glue-gluecontext-defs-getSinkWithFormat).

```
// Example: Write CSV to S3
// For show, customize how we write string type values. Set quoteChar to -1 so our values are not quoted.

import com.amazonaws.services.glue.util.JsonOptions
import com.amazonaws.services.glue.{DynamicFrame, GlueContext}
import org.apache.spark.SparkContext

object GlueApp {
  def main(sysArgs: Array[String]): Unit = {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)
    
    glueContext.getSinkWithFormat(
        connectionType="s3",
        options=JsonOptions("""{"path": "s3://{{s3path}}"}"""),
        format="csv"
    ).writeDynamicFrame(dynamicFrame)
  }
}
```

Vous pouvez également l'utiliser DataFrames dans un script (`org.apache.spark.sql.DataFrame`).

```
dataFrame.write
    .format("csv")
    .option("quote", null)
    .mode("Append")
    .save("s3://{{s3path}}")
```

------

## Référence de configuration CSV
<a name="aws-glue-programming-etl-format-csv-reference"></a>

Vous pouvez utiliser ce qui suit `format_options` partout où les bibliothèques AWS Glue le spécifient `format="csv"` : 
+ `separator` – spécifie le caractère délimiteur. La valeur par défaut est une virgule, mais tout autre caractère peut être spécifié.
  + **Type :** texte, **Valeur par défaut :** `","`
+ `escaper` – spécifie le caractère à utiliser pour l'échappement. Cette option est utilisée uniquement lors de la lecture de fichiers CSV, pas l'écriture. Si cette option est activée, le caractère qui suit immédiatement est utilisé tel quel, sauf pour un petit ensemble d'échappements connus (`\n`, `\r`, `\t` et `\0`).
  + **Type :** texte, **Valeur par défaut :** aucune
+ `quoteChar` – spécifie le caractère à utiliser pour les guillemets. La valeur par défaut est les guillemets doubles. Définissez ce champ sur `-1` pour désactiver entièrement les guillemets.
  + **Type :** texte, **Valeur par défaut :** `'"'`
+ `multiLine` – spécifie si un même enregistrement peut couvrir plusieurs lignes. Cela peut se produire lorsqu’un champ contient un caractère de nouvelle ligne. Vous devez définir cette option sur `True` si aucun enregistrement ne s’étend sur plusieurs lignes. L'activation de `multiLine` peut réduire les performances, car elle nécessite un fractionnement plus prudent des fichiers lors de l'analyse.
  + **Type :** Booléen, **Valeur par défaut :** `false`
+ `withHeader` – spécifie spécifie s'il convient de traiter la première ligne comme un en-tête. Cette option peut être utilisée dans la classe `DynamicFrameReader`.
  + **Type :** Booléen, **Valeur par défaut :** `false`
+ `writeHeader` – spécifie s'il convient d'écrire l'en-tête dans la sortie. Cette option peut être utilisée dans la classe `DynamicFrameWriter`.
  + **Type :** Booléen, **Valeur par défaut :** `true`
+ `skipFirst` – spécifie s'il convient d'ignorer la première ligne de données.
  + **Type :** Booléen, **Valeur par défaut :** `false`
+ `optimizePerformance` –spécifie s'il faut utiliser le lecteur CSV SIMD avancé avec les formats de mémoire en colonnes basés sur Apache Arrow. Disponible uniquement dans les versions 3.0 et ultérieures d'AWS Glue.
  + **Type :** Booléen, **Valeur par défaut :** `false`
+ `strictCheckForQuoting`— Lors de l'écriture CSVs, Glue peut ajouter des guillemets aux valeurs qu'elle interprète comme des chaînes. Cela est fait pour éviter toute ambiguïté dans ce qui est écrit. Pour gagner du temps au moment de décider quoi écrire, Glue peut ajouter des guillemets dans certaines situations où ils ne sont pas nécessaires. L'activation d'une vérification stricte effectuera un calcul plus intensif et n'ajoutera de guillemets qu'en cas de nécessité absolue. Disponible uniquement dans les versions 3.0 et ultérieures d'AWS Glue.
  + **Type :** Booléen, **Valeur par défaut :** `false`

## Optimiser les performances de lecture avec un lecteur CSV SIMD vectorisé
<a name="aws-glue-programming-etl-format-simd-csv-reader"></a>

La version 3.0 d'AWS Glue ajoute un lecteur CSV optimisé qui peut considérablement accélérer les performances globales des tâches par rapport aux lecteurs CSV basés sur des lignes. 

 Le lecteur optimisé :
+ utilise les instructions SIMD du processeur pour lire sur le disque
+ ecrit immédiatement les enregistrements en mémoire dans un format en colonnes (Apache Arrow) 
+ divise les enregistrements en lots

Cette méthode permet de gagner du temps de traitement lorsque les enregistrements sont ultérieurement regroupés ou convertis en format en colonnes. Certains exemples concernent la modification de schémas ou la récupération de données par colonne. 

Pour utiliser le lecteur optimisé, définissez `"optimizePerformance"` sur `true` dans le `format_options` ou la propriété table.

```
glueContext.create_dynamic_frame.from_options(
    frame = datasource1,
    connection_type = "s3", 
    connection_options = {"paths": ["s3://s3path"]}, 
    format = "csv", 
    format_options={
        "optimizePerformance": True, 
        "separator": ","
        }, 
    transformation_ctx = "datasink2")
```

**Limitations du lecteur CSV vectorisé**  
Notez les limitations suivantes du lecteur CSV vectorisé :
+ Il ne prend pas en charge les options de formatage `multiLine` et `escaper`. Il utilise la valeur par défaut `escaper` du caractère guillemets doubles `'"'`. Lorsque ces options sont définies, AWS Glue revient automatiquement à l'utilisation du lecteur CSV basé sur les lignes.
+ Il ne prend pas en charge la création d'un DynamicFrame avec [ChoiceType](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-types.html#aws-glue-api-crawler-pyspark-extensions-types-awsglue-choicetype). 
+ Il ne prend pas en charge la création d'un DynamicFrame avec des [enregistrements d'erreur](https://docs.aws.amazon.com/glue/latest/dg/glue-etl-scala-apis-glue-dynamicframe-class.html#glue-etl-scala-apis-glue-dynamicframe-class-defs-errorsAsDynamicFrame).
+ Il ne prend pas en charge la lecture de fichiers CSV contenant des caractères multioctets tels que des caractères japonais ou chinois.