Verwenden des JSON-Formats in AWS Glue - AWS Glue

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden des JSON-Formats in AWS Glue

AWS Glue ruft Daten aus Quellen ab und schreibt Daten auf Ziele, die in verschiedenen Datenformaten gespeichert und transportiert werden. Wenn Ihre Daten im JSON-Datenformat gespeichert oder transportiert werden, stellt Ihnen dieses Dokument die verfügbaren Funktionen für die Verwendung Ihrer Daten in AWS Glue vor.

AWS Glue unterstützt die Verwendung des JSON-Formats. Dieses Format stellt Datenstrukturen mit einheitlicher Form, aber flexiblem Inhalt dar, die nicht zeilen- oder spaltenbasiert sind. JSON wird durch parallel Standards definiert, die von mehreren Behörden herausgegeben werden, von denen eine ECMA-404 ist. Eine Einführung in das Format durch eine häufig referenzierte Quelle finden Sie unter Einführung in JSON.

Sie können AWS Glue verwenden, um JSON-Dateien aus Amazon S3 bzip sowie gzip komprimierte JSON-Dateien zu lesen. Sie konfigurieren das Komprimierungsverhalten auf S3-Verbindungsparameter statt in der auf dieser Seite besprochenen Konfiguration.

Lesen Write (Schreiben) Streaming gelesen Gruppieren von kleinen Dateien Auftrags-Lesezeichen
Unterstützt Unterstützt Unterstützt Unterstützt Unterstützt

Beispiel: Lesen von JSON-Dateien oder Ordnern aus S3

Voraussetzungen: Sie benötigen die S3-Pfade (s3path) zu den JSON-Dateien oder Ordnern, die Sie lesen möchten.

Konfiguration: Geben Sie in Ihren Funktionsoptionen format="json" an. Verwenden Sie in Ihrem connection_options den paths-Schlüssel, um Ihren s3path anzugeben. Sie können in den Verbindungsoptionen weiter ändern, wie Ihr Lesevorgang s3 durchquert, siehe Referenz zur Amazon-S3-Verbindungsoption für Einzelheiten. Sie können konfigurieren, wie der Reader JSON-Dateien in Ihrem format_options interpretiert. Einzelheiten finden Sie in der JSON-Konfigurationsreferenz.

Das folgende AWS Glue-ETL-Skript zeigt den Prozess des Lesens von JSON-Dateien oder -Ordnern aus S3:

Python

Verwenden Sie für dieses Beispiel die Methode 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 } )

Sie können es auch DataFrames in einem Skript (pyspark.sql.DataFrame) verwenden.

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

Verwenden Sie für dieses Beispiel die Operation 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() } }

Sie können es auch DataFrames in einem Skript (pyspark.sql.DataFrame) verwenden.

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

Beispiel: Schreiben von JSON-Dateien und -Ordnern in S3

Voraussetzungen: Sie benötigen ein initialisiertes DataFrame (dataFrame) oder DynamicFrame (dynamicFrame). Sie benötigen auch Ihren erwarteten S3-Ausgabepfad, s3path.

Konfiguration: Geben Sie in Ihren Funktionsoptionen format="json" an. Verwenden Sie in Ihrem connection_options den paths-Schlüssel, um s3path anzugeben. Sie können die Art und Weise, wie der Writer mit S3 in connection_options interagiert, weiter verändern. Einzelheiten finden Sie unter Datenformatoptionen für ETL-Eingaben und -Ausgaben in AWS Glue:Referenz zur Amazon-S3-Verbindungsoption. Sie können konfigurieren, wie der Writer JSON-Dateien in Ihrem format_options interpretiert. Einzelheiten finden Sie in der JSON-Konfigurationsreferenz.

Das folgende AWS Glue-ETL-Skript zeigt den Prozess des Schreibens von JSON-Dateien oder -Ordnern aus S3:

Python

Verwenden Sie für dieses Beispiel die Methode 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" )

Sie können es auch DataFrames in einem Skript (pyspark.sql.DataFrame) verwenden.

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

Verwenden Sie für dieses Beispiel die getSinkWithFormat-Methode.

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

Sie können auch DataFrames in einem Skript (pyspark.sql.DataFrame) verwenden.

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

JSON-Konfigurationsreferenz

Sie können folgende format_options-Werte mit format="json" verwenden:

  • jsonPath— Ein JsonPathAusdruck, der ein Objekt identifiziert, das in Datensätze eingelesen werden soll. Dies ist besonders nützlich, wenn eine Datei Datensätze enthält, die in einem äußeren Array verschachtelt sind. Der folgende JsonPath Ausdruck zielt beispielsweise auf das id Feld eines JSON-Objekts ab.

    format="json", format_options={"jsonPath": "$.id"}
  • multiLine – Ein boolescher Wert, der angibt, ob ein einzelner Datensatz mehrere Zeilen umfassen kann. Dies kommt vor, wenn ein Feld ein Neue-Zeile-Zeichen in Anführungszeichen enthält. Sie müssen diese Option auf ""true" setzen, wenn ein Datensatz mehrere Zeilen umfasst. Der Standardwert ist "false". Dies ermöglicht eine rigorosere Dateiaufteilung während der Analyse.

  • optimizePerformance – Ein boolescher Wert, der angibt, ob der erweiterte SIMD-JSON-Reader zusammen mit Apache Arrow basierten spaltenförmigen Speicherformaten verwendet werden soll. Nur verfügbar in AWS Glue 3.0. Nicht kompatibel mit multiLine oder jsonPath. Wenn Sie eine dieser Optionen angeben, wird AWS Glue angewiesen, auf den Standardleser zurückzugreifen.

  • withSchema – Ein String-Wert, der ein Tabellenschema in dem in Geben Sie das XML-Schema manuell an beschriebenen Format festlegt. Wird nur mit optimizePerformance beim Lesen von Nicht-Catalog-Verbindungen verwendet.

Verwendung vektorisierter SIMD-JSON-Reader mit Apache-Arrow-Spaltenformat

AWS Glue-Version 3.0 fügt einen vektorisierten Reader für JSON-Daten hinzu. Er arbeitet unter bestimmten Bedingungen doppelt so schnell als der Standard-Reader. Dieser Reader weist bestimmte Einschränkungen auf, die Benutzer vor der Verwendung beachten sollten und die in diesem Abschnitt dokumentiert werden.

Um den optimierten Reader zu verwenden, setzen Sie "optimizePerformance" auf True in der format_options- oder Tabelleneigenschaft. Sie müssen außerdem withSchema angeben, sofern nicht aus dem Katalog gelesen wird. withSchema erwartet eine Eingabe wie in der Geben Sie das XML-Schema manuell an beschrieben

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

Weitere Informationen zum Gebäude a SchemaStringin der AWS Glue-Bibliothek finden Sie unterPySpark-Erweiterungstypen.

Einschränkungen für den vektorisierten CSV-Reader

Es gelten die folgenden Einschränkungen:

  • JSON-Elemente mit verschachtelten Objekten oder Array-Werten werden nicht unterstützt. Falls angegeben, AWS greift Glue auf den Standardleser zurück.

  • Ein Schema muss bereitgestellt werden, entweder aus dem Katalog oder mit withSchema.

  • Nicht kompatibel mit multiLine oder jsonPath. Wenn Sie eine dieser Optionen angeben, wird AWS Glue angewiesen, auf den Standardleser zurückzugreifen.

  • Das Bereitstellen von Eingabedatensätzen, die nicht mit dem Eingabeschema übereinstimmen, führt zum Fehlschlagen des Readers.

  • Fehler-Aufzeichnungen werden nicht erstellt.

  • Das Lesen von JSON-Dateien mit MultiByte-Zeichen (wie japanische oder chinesische Zeichen) wird nicht unterstützt.