

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 JSON dans AWS Glue
<a name="aws-glue-programming-etl-format-json-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 JSON, ce document vous présente les fonctionnalités disponibles pour utiliser vos données dans AWS Glue.

AWS Glue prend en charge l'utilisation du format JSON. Ce format représente des structures de données avec une forme uniforme mais un contenu flexible qui ne sont pas basés sur des lignes ou des colonnes. Le JSON est défini par des normes parallelles émises par plusieurs autorités, dont l’ECMA-404. Pour accéder à une présentation du format par une source fréquemment référencée, consultez [Introducing JSON](https://www.json.org/) (Présentation de JSON).

Vous pouvez utiliser AWS Glue pour lire des fichiers JSON depuis Amazon S3, ainsi que `bzip` des fichiers JSON `gzip` compressés. 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. 


| 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 JSON de S3
<a name="aws-glue-programming-etl-format-json-read"></a>

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

**Configuration :** dans vos options de fonction, spécifiez `format="json"`. Dans vos `connection_options`, utilisez la clé `paths` pour spécifier votre `s3path`. Vous pouvez également modifier la façon dont votre opération de lecture traversera s3 dans les options de connexion, consultez [Référence des options de connexion Amazon S3](aws-glue-programming-etl-connect-s3-home.md#aws-glue-programming-etl-connect-s3) pour plus d’informations. Vous pouvez configurer la manière dont le lecteur interprète les fichiers JSON dans votre `format_options`. Pour plus d'informations, consultez [JSON Configuration Reference](#aws-glue-programming-etl-format-json-reference) (Référence de configuration JSON). 

 Le script AWS Glue ETL suivant montre le processus de lecture de fichiers ou de dossiers JSON depuis S3 : 

------
#### [ 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 JSON from S3
# For show, we handle a nested JSON file that we can limit with the JsonPath parameter
# For show, we also handle a JSON where a single entry spans multiple lines
# 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="json",
    format_options={
        "jsonPath": "$.id",
        "multiline": True,
        # "optimizePerformance": True, -> not compatible with jsonPath, multiline
    }
)
```

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

```
dataFrame = spark.read\
    .option("multiline", "true")\
    .json("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 JSON from S3
// For show, we handle a nested JSON file that we can limit with the JsonPath parameter
// For show, we also handle a JSON where a single entry spans multiple lines
// 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("""{"jsonPath": "$.id", "multiline": true, "optimizePerformance":false}"""),
      connectionType="s3",
      format="json",
      options=JsonOptions("""{"paths": ["s3://{{s3path}}"], "recurse": true}""")
    ).getDynamicFrame()
  }
}
```

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

```
val dataFrame = spark.read
    .option("multiline", "true")
    .json("s3://{{s3path}}")
```

------

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

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

**Configuration :** dans vos options de fonction, spécifiez `format="json"`. Dans vos `connection_options`, utilisez la clé `paths` pour spécifier `s3path`. Vous pouvez modifier davantage la manière dont le scripteur interagit avec S3 dans les `connection_options`. Pour plus de détails, voir Options de format de données pour les entrées et sorties ETL dans AWS Glue :[Référence des options de connexion Amazon 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 JSON dans votre `format_options`. Pour plus d'informations, consultez [JSON Configuration Reference](#aws-glue-programming-etl-format-json-reference) (Référence de configuration JSON). 

Le script AWS Glue ETL suivant montre le processus d'écriture de fichiers ou de dossiers JSON à partir de 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 JSON to S3

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="json"
)
```

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

```
df.write.json("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 JSON to S3

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="json"
    ).writeDynamicFrame(dynamicFrame)
  }
}
```

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

```
df.write.json("s3://{{s3path}}")
```

------

## Référence de configurations Json
<a name="aws-glue-programming-etl-format-json-reference"></a>

Vous pouvez utiliser les valeurs `format_options` suivantes avec `format="json"` :
+ `jsonPath`— [JsonPath](https://github.com/json-path/JsonPath)Expression qui identifie un objet à lire dans des enregistrements. Cette expression est particulièrement utile lorsqu’un fichier contient des enregistrements imbriqués à l’intérieur d’un tableau externe. Par exemple, l' JsonPath expression suivante cible le `id` champ d'un objet JSON.

  ```
  format="json", format_options={"jsonPath": "$.id"}
  ```
+ `multiline` — valeur booléenne qui 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. La valeur par défaut est `"false"`, qui permet un fractionnement en fichiers plus agressif pendant l’analyse.
+ `optimizePerformance` — valeur booléenne qui 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 AWS Glue 3.0. Non compatible avec `multiline` ou `jsonPath`. Si vous fournissez l'une ou l'autre de ces options, AWS Glue sera obligée de revenir au lecteur standard.
+ `withSchema` — Une valeur String qui spécifie un schéma de table au format décrit dans [Spécifier manuellement le schéma XML](aws-glue-programming-etl-format-xml-home.md#aws-glue-programming-etl-format-xml-withschema). Utilisé uniquement avec `optimizePerformance` lors de la lecture à partir de connexions hors catalogue.

## Utilisation d’un lecteur CSV SIMD vectorisé avec le format en colonnes Apache Arrow
<a name="aws-glue-programming-etl-format-simd-json-reader"></a>

AWS Glue La version 3.0 ajoute un lecteur vectorisé pour les données JSON. Il fonctionne deux fois plus vite dans certaines conditions que le lecteur standard. Ce lecteur est livré avec certaines limitations dont les utilisateurs doivent être conscients avant utilisation, décrites dans cette section.

Pour utiliser le lecteur optimisé, définissez `"optimizePerformance"` sur True dans le `format_options` ou la propriété table. Vous devrez également fournir `withSchema` sauf si vous lisez le catalogue. `withSchema` attend une entrée comme décrit dans le [Spécifier manuellement le schéma XML](aws-glue-programming-etl-format-xml-home.md#aws-glue-programming-etl-format-xml-withschema).

```
// Read from S3 data source        
glueContext.create_dynamic_frame.from_options(
    connection_type = "s3", 
    connection_options = {"paths": ["s3://{{s3path}}"]}, 
    format = "json", 
    format_options={
        "optimizePerformance": True,
        "withSchema": {{SchemaString}}
        })    
 
// Read from catalog table
glueContext.create_dynamic_frame.from_catalog(
    database = database, 
    table_name = table, 
    additional_options = {
    // The vectorized reader for JSON can read your schema from a catalog table property.
        "optimizePerformance": True,
        })
```

Pour plus d'informations sur la création d'un {{SchemaString}} dans la bibliothèque AWS Glue, consultez[PySpark types d'extensions](aws-glue-api-crawler-pyspark-extensions-types.md).

**Limitations du lecteur CSV vectorisé**  
Prenez en compte les limitations suivantes :
+ Les éléments JSON avec des objets imbriqués ou des valeurs de tableau ne sont pas pris en charge. S'il est fourni, AWS Glue retournera au lecteur standard.
+ Un schéma doit être fourni, soit à partir du catalogue, soit avec `withSchema`.
+ Non compatible avec `multiline` ou `jsonPath`. Si vous fournissez l'une ou l'autre de ces options, AWS Glue sera obligée de revenir au lecteur standard.
+ Le fait de fournir des enregistrements d’entrée qui ne correspondent pas au schéma d’entrée entraînera un dysfonctionnement du lecteur.
+ [Les enregistrements d’erreurs](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) ne seront pas créés.
+ Les fichiers JSON contenant des caractères à plusieurs octets (tels que les caractères japonais ou chinois) ne sont pas pris en charge.