Wie verwende ich Pivoted-Daten nach einer relationalisierte Transformation in AWS Glue?

Lesedauer: 4 Minute
0

Ich möchte die rationalisierte Transformation von AWS Glue verwenden, um meine Daten zu glätten. Welche Felder kann ich als Partitionen verwenden, um die pivotierten Daten in Amazon Simple Storage Service (Amazon S3) zu speichern?

Kurzbeschreibung

Die relationalisierte Transformationermöglicht die Verwendung von NoSQL-Datenstrukturen, wie Arrays und Structs, in relationalen Datenbanken. Die relationalisierte Transformation liefert eine Sammlung von DynamicFrames (eine DynamicFrameCollection in Python und ein Array in Scala). Auf alle DynamicFrames, die von einer relationalisierte Transformation zurückgegeben werden, kann über ihre individuellen Namen in Python und über Array-Indizes in Scala zugegriffen werden.

Behebung

Relationalisieren Sie die Daten

Dieses Tutorial verwendet das folgende Schema:

|-- family_name: string
|-- name: string
|-- gender: string
|-- image: string
|-- images: array
|    |-- element: struct
|    |    |-- url: string

Verwenden Sie die folgende Relationalisierungssyntax für Python:

# AWS Glue Data Catalog: database and table names
db_name = "us-legislators"
tempDir = "s3://awsexamplebucket/temp_dir/"

# Create dynamic frames from the source tables
persons = glueContext.create_dynamic_frame.from_catalog(database=db_name, table_name=tbl_persons)

# Relationalize transformation
dfc = persons.relationalize("root", tempDir)
dfc.select('root_images').printSchema()
dfc.select('root_images').show()

Verwenden Sie die folgende Relationalisierungssyntax für Scala:

// AWS Glue Data Catalog: database and table names
val dbName = "us-legislators"
val tblPersons = "persons_json"

// Output Amazon S3 temp directory
val tempDir = "s3://awsexamplebucket/temp_dir"

val persons: DynamicFrame = glueContext.getCatalogSource(database = dbName, tableName = tblPersons).getDynamicFrame()
val personRelationalize = persons.relationalize(rootTableName = "root", stagingPath = tempDir)
personRelationalize(2).printSchema()
personRelationalize(2).show()

Interpretieren Sie die pivotierten Daten

Diese relationalisierte Transformation erzeugt zwei Schemas: root und****root_images.

root:

|-- family_name: string
|-- name: string
|-- gender: string
|-- image: string
|-- images: long

root_images:

|-- id: long
|-- index: int
|-- images.val.url: string
  • id: Reihenfolge des Array-Elements (1, 2 oder 3)
  • index: Indexposition für jedes Element in einem Array
  • images.val.url: Wert für images.val.url im Stammverzeichnis_ images****

Dies sind die einzigen Felder, die als Partitionsfelder verwendet werden können, um diese pivotierten Daten in Amazon S3 zu speichern. Die Angabe von **** Stammtabellenfeldern, wie z. B. Name, funktioniert nicht, da diese Felder in **root_images **nicht existieren.

Verbinde die relationalisierten Daten, um die normalisierten Daten zu erhalten

Das **** ID-Attribut in **root_images **gibt die Reihenfolge der Arrays (1, 2 oder 3) im Datensatz an. Das **** Images-Attribut im **Stammverzeichnis **enthält den Wert des Array-Index. Das bedeutet, dass Sie Images und****ID verwenden müssen, um **root und ****root_images **zu verbinden. Sie können **DynamicFrame.Show() ausführen, ** um die Reihenfolge der Arrays und den Wert des Array-Index zu überprüfen.

Um **root und****root_images **zu verbinden:

Python:

joined_root_root_images = Join.apply(dfc.select('root'), dfc.select('root_images'), 'images', 'id')

Skala:

val joined_root_root_images = personRelationalize(0).join(keys1 = Seq("images"), keys2 = Seq("id"), frame2 = personRelationalize(1))

Speichern Sie die pivotierten Daten

So speichern Sie die pivotierten Daten in Amazon S3 mit Partitionen:

Python:

datasink4 = glueContext.write_dynamic_frame.from_options(frame = dfc.select('root_images'), connection_type = "s3", connection_options = {"path": outputHistoryDir,"partitionKeys":["id"]}, format = "csv",transformation_ctx = "datasink4")

Skala:

Hinweis: Im folgenden Beispiel **ist **personRelationalize (2) die **pivotierte **Stammdatentabelle_images.

glueContext.getSinkWithFormat(connectionType = "s3",
  options = JsonOptions(Map("path" -> paths, "partitionKeys" -> List("id"))),
  format = "csv", transformationContext = "").writeDynamicFrame(personRelationalize(2))

So speichern Sie die pivotierten Daten in Amazon S3 ohne Partitionen:

Python:

datasink5 = glueContext.write_dynamic_frame.from_options(frame = dfc.select('root_images'), connection_type = "s3", connection_options = {"path": outputHistoryDir}, format = "csv",transformation_ctx = "datasink5"

Skala:

Hinweis: Im folgenden Beispiel **ist **personRelationalize (2) die **pivotierte **Stammdatentabelle_images.

glueContext.getSinkWithFormat(connectionType = "s3",
  options = JsonOptions(Map("path" -> paths)),
  format = "csv", transformationContext = "").writeDynamicFrame(personRelationalize(2))

Nachdem Sie die Daten in Amazon S3 geschrieben haben, fragen Sie die Daten in Amazon Athena ab oder verwenden Sie einen DynamicFrame, um die Daten in eine relationale Datenbankwie Amazon Redshift zu schreiben.


Verwandte Informationen

Vereinfachen Sie das Abfragen von verschachteltem JSON mit der relationalisierte Transformation von AWS Glue

Code-Beispiel: Daten verbinden und relationalisieren

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 3 Jahren