Utilizzo del formato JSON in AWS Glue - AWS Glue

Utilizzo del formato JSON in AWS Glue

AWS Glue recupera i dati dalle origini e scrive i dati sulle destinazioni archiviati e trasportati in vari formati di dati. Se i tuoi dati vengono archiviati o trasportati nel formato dati JSON, questo documento descrive le funzionalità disponibili per l'utilizzo dei dati in AWS Glue.

AWS Glue supporta l'uso del formato JSON. Questo formato rappresenta strutture di dati con forma coerente ma contenuti flessibili, che non sono basate su righe o colonne. JSON è definito tramite standard paralleli emessi da diverse autorità, una delle quali è ECMA-404. Per un'introduzione al formato da una fonte di riferimento comune, consulta Introduzione a JSON.

Puoi utilizzare AWS Glue per leggere file JSON da Amazon S3, nonché file KJSON compressi bzip e gzip. Puoi configurare il comportamento di compressione sul Parametri di connessione di S3 invece che nella configurazione discussa in questa pagina.

Lettura Scrittura Lettura in streaming Gruppo di file piccoli Segnalibri di processo
Supportato Supportato Supportato Supportato Supportato

Esempio: lettura di cartelle o file JSON da S3

Prerequisiti: occorrono i percorsi S3 (s3path) nelle cartelle o nei file JSON da leggere.

Configurazione: nelle opzioni della funzione, specifica format="json". Nelle tue connection_options, utilizza la chiave paths per specificare s3path. Puoi modificare ulteriormente la modalità con cui l'operazione di lettura attraversa s3 nelle opzioni di connessione; consulta Indicazioni di riferimento alle opzioni di connessione ad Amazon S3 per dettagli. Puoi configurare la modalità con cui il reader interpreta i file JSON in format_options. Per i dettagli, consulta la Documentazione di riferimento della configurazione JSON.

Lo script ETL di AWS Glue riportato di seguito mostra il processo di lettura di cartelle o file JSON da S3:

Python

Per questo esempio, utilizzare il metodo 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 } )

È possibile utilizzare DataFrames anche in uno script (pyspark.sql.DataFrame).

dataFrame = spark.read\ .option("multiline", "true")\ .json("s3://s3path")
Scala

Per questo esempio, utilizzare l'operazione 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() } }

È possibile utilizzare DataFrames anche in uno script (pyspark.sql.DataFrame).

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

Esempio: scrittura di file e cartelle JSON su S3

Prerequisiti: occorre un DataFrame (dataFrame) o un DynamicFrame (dynamicFrame) inizializzato. È necessario anche del tuo percorso di output S3 previsto, s3path.

Configurazione: nelle opzioni della funzione, specifica format="json". In connection_options, utilizzare la chiave paths per specificare s3path. È possibile modificare ulteriormente il modo in cui il writer interagisce con S3 nelle connection_options. Per i dettagli, consultare le Opzioni del formato dati per input e output ETL in AWS Glue: Indicazioni di riferimento alle opzioni di connessione ad Amazon S3. È possibile configurare la modalità con cui il writer interpreta i file JSON in format_options. Per i dettagli, consultare la Documentazione di riferimento della configurazione JSON.

Lo script ETL di AWS Glue riportato di seguito mostra il processo di scrittura di cartelle o file JSON da S3:

Python

Per questo esempio, utilizza il metodo 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" )

È possibile utilizzare DataFrames anche in uno script (pyspark.sql.DataFrame).

df.write.json("s3://s3path/")
Scala

Per questo esempio, utilizza l'operazione 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) } }

È possibile utilizzare DataFrames anche in uno script (pyspark.sql.DataFrame).

df.write.json("s3://s3path")

Documentazione di riferimento della configurazione JSON

È possibile usare i valori di format_options seguenti con format="json":

  • jsonPath: una espressione JsonPath che identifica un oggetto da leggere nei registri. È particolarmente utile quando un file contiene registri annidati in una matrice esterna. L'espressione JsonPath seguente, ad esempio, ha come target il campo id di un oggetto JSON.

    format="json", format_options={"jsonPath": "$.id"}
  • multiline: un valore booleano che specifica se un singolo registro può estendersi su più righe. Ciò può accadere quando un campo contiene un carattere di nuova riga tra virgolette. Imposta questa opzione su "true" se i registri si estendono su più righe. Il valore di default è "false", che consente una divisione dei file più netta durante l'analisi.

  • optimizePerformance: valore booleano che specifica se utilizzare il lettore JSON SIMD avanzato insieme ai formati di memoria colonnare basati su Apache Arrow. Disponibile solo in AWS Glue 3.0. Non compatibile con multiline o jsonPath. Fornire una di queste opzioni istruirà AWS Glue per tornare al lettore standard.

  • withSchema: un valore di stringa che specifica uno schema di tabella nel formato descritto in Specifica manuale dello schema XML. Utilizzato solo con optimizePerformance durante la lettura da connessioni non di catalogo.

Utilizzo del lettore JSON SIMD vettorizzato con formato colonnare Apache Arrow

La versione AWS Glue 3.0 aggiunge un lettore vettorizzato per i dati JSON. Funziona 2 volte più velocemente in determinate condizioni, rispetto al lettore standard. Questo lettore presenta alcune limitazioni di cui gli utenti dovrebbero essere consapevoli prima dell'uso, documentate in questa sezione.

Per utilizzare il lettore ottimizzato, impostare "optimizePerformance" a True nella format_options o nella proprietà della tabella. È necessario anche fornire withSchema a meno che non venga letto dal catalogo. withSchema prevede un input come descritto nel Specifica manuale dello schema XML

// 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, })

Per ulteriori informazioni sullo sviluppo di uno SchemaString nella libreria AWS Glue, consultare Tipi di estensione PySpark.

Limitazioni per il lettore CSV vettorizzato

Nota i seguenti limiti:

  • Gli elementi JSON con oggetti nidificati o valori di array non sono supportati. Se previsto, AWS Glue tornerà al lettore standard.

  • È necessario fornire uno schema, dal catalogo o con withSchema.

  • Non compatibile con multiline o jsonPath. Fornire una di queste opzioni istruirà AWS Glue per tornare al lettore standard.

  • Fornire registri di input che non corrispondono allo schema di input provocherà il fallimento del lettore.

  • I registri di errori non verranno creati.

  • Non supporta file JSON con caratteri multibyte (come caratteri giapponesi o cinesi).