New user sign up using AWS Builder ID
New user sign up using AWS Builder ID is currently unavailable on re:Post. To sign up, please use the AWS Management Console instead.
Wie verwende ich Pivoted-Daten nach einer relationalisierte Transformation in AWS Glue?
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
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 3 Monaten
- AWS OFFICIALAktualisiert vor 5 Monaten
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren