Ti nye visuelle transformationer i AWS Glue Studio

Ti nye visuelle transformationer i AWS Glue Studio

Kildeknude: 2641422

AWS Glue Studio er en grafisk grænseflade, der gør det nemt at oprette, køre og overvåge udtrække, transformere og indlæse (ETL) jobs i AWS Lim. Det giver dig mulighed for visuelt at sammensætte datatransformations-workflows ved hjælp af noder, der repræsenterer forskellige datahåndteringstrin, som senere konverteres automatisk til kode for at køre.

AWS Glue Studio For nylig udgivet 10 flere visuelle transformationer for at give mulighed for at skabe mere avancerede jobs på en visuel måde uden kodefærdigheder. I dette indlæg diskuterer vi potentielle anvendelsessager, der afspejler almindelige ETL-behov.

De nye transformationer, der vil blive demonstreret i dette indlæg, er: Sammenkædning, Split streng, Array til kolonner, Tilføj aktuelt tidsstempel, Pivot rækker til kolonner, Unpivot kolonner til rækker, Opslag, Eksploder matrix eller kortlægning i kolonner, Afledt kolonne og Autobalancebehandling .

Løsningsoversigt

I dette tilfælde har vi nogle JSON-filer med aktieoptionsoperationer. Vi ønsker at lave nogle transformationer, inden vi lagrer dataene for at gøre det nemmere at analysere, og vi ønsker også at lave et separat datasætresumé.

I dette datasæt repræsenterer hver række en handel med optionskontrakter. Optioner er finansielle instrumenter, der giver ret - men ikke pligt - til at købe eller sælge aktieaktier til en fast pris (kaldet  strejke pris) før en defineret udløbsdato.

Indtast data

Dataene følger følgende skema:

  • Ordre ID – Et unikt ID
  • symbol – En kode, der generelt er baseret på nogle få bogstaver for at identificere det selskab, der udsender de underliggende aktieaktier
  • instrument – Navnet, der identificerer den specifikke option, der købes eller sælges
  • valuta – ISO-valutakoden, som prisen er udtrykt i
  • pris – Det beløb, der blev betalt for købet af hver optionskontrakt (på de fleste børser giver én kontrakt dig mulighed for at købe eller sælge 100 aktieaktier)
  • udveksling – Koden for det byttecenter eller det sted, hvor optionen blev handlet
  • solgt – En liste over antallet af kontrakter, der blev tildelt til at udfylde salgsordren, når dette er en salgshandel
  • købte – En liste over antallet af kontrakter, der er tildelt til at udfylde købsordre, når dette er købshandel

Følgende er et eksempel på de syntetiske data, der er genereret til dette indlæg:

{"order_id": 1679931512485, "symbol": "AMZN", "instrument": "AMZN MAR 24 23 102 PUT", "currency": "usd", "price": 17.18, "exchange": "EDGX", "bought": [18, 38]}
{"order_id": 1679931512486, "symbol": "BMW.DE", "instrument": "BMW.DE MAR 24 23 96 PUT", "currency": "eur", "price": 2.98, "exchange": "XETR", "bought": [28]}
{"order_id": 1679931512487, "symbol": "BMW.DE", "instrument": "BMW.DE APR 28 23 101 CALL", "currency": "eur", "price": 14.71, "exchange": "XETR", "sold": [9, 59, 54]}
{"order_id": 1679931512489, "symbol": "JPM", "instrument": "JPM JUN 30 23 140 CALL", "currency": "usd", "price": 11.83, "exchange": "EDGX", "bought": [33, 42, 55, 67]}
{"order_id": 1679931512490, "symbol": "SIE.DE", "instrument": "SIE.DE MAR 24 23 149 CALL", "currency": "eur", "price": 13.68, "exchange": "XETR", "bought": [96, 89, 82]}
{"order_id": 1679931512491, "symbol": "NKE", "instrument": "NKE MAR 24 23 112 CALL", "currency": "usd", "price": 3.23, "exchange": "EDGX", "sold": [67]}
{"order_id": 1679931512492, "symbol": "AMZN", "instrument": "AMZN MAY 26 23 95 CALL", "currency": "usd", "price": 11.44, "exchange": "EDGX", "sold": [41, 62, 12]}
{"order_id": 1679931512493, "symbol": "JPM", "instrument": "JPM MAR 24 23 121 PUT", "currency": "usd", "price": 1.0, "exchange": "EDGX", "bought": [61, 34]}
{"order_id": 1679931512494, "symbol": "SAP.DE", "instrument": "SAP.DE MAR 24 23 132 CALL", "currency": "eur", "price": 15.9, "exchange": "XETR", "bought": [69, 33]}

ETL krav

Disse data har en række unikke egenskaber, som ofte findes på ældre systemer, der gør dataene sværere at bruge.

Følgende er ETL-kravene:

  • Instrumentnavnet har værdifuld information, som er beregnet til at mennesker kan forstå; vi ønsker at normalisere det i separate kolonner for lettere analyse.
  • Egenskaberne bought , sold udelukker hinanden; vi kan konsolidere dem i en enkelt kolonne med kontraktnumrene og have en anden kolonne, der angiver, om kontrakterne er købt eller solgt i denne rækkefølge.
  • Vi ønsker at beholde oplysningerne om de individuelle kontrakttildelinger, men som individuelle rækker i stedet for at tvinge brugerne til at håndtere en række tal. Vi kunne lægge tallene sammen, men vi ville miste information om, hvordan ordren blev udfyldt (som indikerer markedslikviditet). I stedet vælger vi at denormalisere tabellen, så hver række har et enkelt antal kontrakter, og opdeler ordrer med flere tal i separate rækker. I et komprimeret søjleformat er den ekstra datasætstørrelse af denne gentagelse ofte lille, når komprimering anvendes, så det er acceptabelt at gøre datasættet nemmere at forespørge.
  • Vi ønsker at generere en oversigtstabel over volumen for hver optiontype (call and put) for hver aktie. Dette giver en indikation af markedsstemningen for hver aktie og markedet generelt (grådighed vs. frygt).
  • For at muliggøre overordnede handelsoversigter ønsker vi for hver operation at angive totalsummen og standardisere valutaen til amerikanske dollars ved hjælp af en omtrentlig konverteringsreference.
  • Vi ønsker at tilføje datoen for, hvornår disse transformationer fandt sted. Dette kunne f.eks. være nyttigt for at have en reference til, hvornår valutaomregningen blev foretaget.

Baseret på disse krav vil jobbet producere to output:

  • En CSV-fil med en oversigt over antallet af kontrakter for hvert symbol og type
  • En katalogtabel til at holde en historik over ordren efter at have udført de angivne transformationer
    Dataskema

Forudsætninger

Du skal bruge din egen S3-spand til at følge med i denne brugssag. For at oprette en ny spand, se Oprettelse af en spand.

Generer syntetiske data

For at følge med i dette indlæg (eller eksperimentere med denne slags data på egen hånd), kan du generere dette datasæt syntetisk. Følgende Python-script kan køres i et Python-miljø med Boto3 installeret og adgang til Amazon Simple Storage Service (Amazon S3).

For at generere data skal du udføre følgende trin:

  1. På AWS Glue Studio skal du oprette et nyt job med muligheden Python shell script editor.
  2. Giv jobbet et navn og på Joboplysninger fanen, skal du vælge en passende rolle og et navn til Python-scriptet.
  3. I Joboplysninger sektion, udvide Avancerede egenskaber og rul ned til Jobparametre.
  4. Indtast en parameter med navnet --bucket og tildel som værdi navnet på den bøtte, du vil bruge til at gemme prøvedataene.
  5. Indtast følgende script i AWS Glue shell-editoren:
    import argparse
    import boto3
    from datetime import datetime
    import io
    import json
    import random
    import sys # Configuration
    parser = argparse.ArgumentParser()
    parser.add_argument('--bucket')
    args, ignore = parser.parse_known_args()
    if not args.bucket: raise Exception("This script requires an argument --bucket with the value specifying the S3 bucket where to store the files generated") data_bucket = args.bucket
    data_path = "transformsblog/inputdata"
    samples_per_file = 1000 # Create a single file with synthetic data samples
    s3 = boto3.client('s3')
    buff = io.BytesIO() sample_stocks = [("AMZN", 95, "usd"), ("NKE", 120, "usd"), ("JPM", 130, "usd"), ("KO", 130, "usd"), ("BMW.DE", 95, "eur"), ("SIE.DE", 140, "eur"), ("SAP.DE", 115, "eur")]
    option_type = ["PUT", "CALL"]
    operations = ["sold", "bought"]
    dates = ["MAR 24 23", "APR 28 23", "MAY 26 23", "JUN 30 23"]
    for i in range(samples_per_file): stock = random.choice(sample_stocks) symbol = stock[0] ref_price = stock[1] currency = stock[2] strike_price = round(ref_price * 0.9 + ref_price * random.uniform(0.01, 0.3)) sample = { "order_id": int(datetime.now().timestamp() * 1000) + i, "symbol": stock[0], "instrument":f"{symbol} {random.choice(dates)} {strike_price} {random.choice(option_type)}", "currency": currency, "price": round(random.uniform(0.5, 20.1), 2), "exchange": "EDGX" if currency == "usd" else "XETR" } sample[random.choice(operations)] = [random.randrange(1,100) for i in range(random.randrange(1,5))] buff.write(json.dumps(sample).encode()) buff.write("n".encode()) s3.put_object(Body=buff.getvalue(), Bucket=data_bucket, Key=f"{data_path}/{int(datetime.now().timestamp())}.json")

  6. Kør jobbet, og vent, indtil det viser sig som fuldført på fanen Kørsler (det bør kun tage et par sekunder).

Hver kørsel genererer en JSON-fil med 1,000 rækker under den angivne bucket og præfikset transformsblog/inputdata/. Du kan køre jobbet flere gange, hvis du vil teste med flere inputfiler.
Hver linje i de syntetiske data er en datarække, der repræsenterer et JSON-objekt som følgende:

{ "order_id":1681986991888, "symbol":"AMZN", "instrument":"AMZN APR 28 23 100 PUT", "currency":"usd", "price":2.89, "exchange":"EDGX", "sold":[88,49]
}

Opret AWS Glue visuelle job

For at oprette AWS Glue visuelle job skal du udføre følgende trin:

  1. Gå til AWS Glue Studio og opret et job ved hjælp af muligheden Visuel med et tomt lærred.
  2. Redigere Untitled job at give den et navn og tildele den en rolle, der passer til AWS Glue på den Joboplysninger fane.
  3. Tilføj en S3-datakilde (du kan navngive den JSON files source) og indtast den S3 URL, som filerne er gemt under (f.eks. s3://<your bucket name>/transformsblog/inputdata/), vælg derefter JSON som dataformat.
  4. Type Udled skema så det indstiller output-skemaet baseret på dataene.

Fra denne kildenode vil du blive ved med at kæde transformationer. Når du tilføjer hver transformation, skal du sørge for, at den valgte node er den sidst tilføjede, så den bliver tildelt som forælder, medmindre andet er angivet i instruktionerne.

Hvis du ikke har valgt den rigtige forælder, kan du altid redigere forælderen ved at vælge den og vælge en anden forælder i konfigurationsruden.

Node forældrekonfiguration

For hver tilføjet node vil du give den et specifikt navn (så formålet med noden fremgår af grafen) og konfiguration på Transform fane.

Hver gang en transformation ændrer skemaet (f.eks. tilføje en ny kolonne), skal outputskemaet opdateres, så det er synligt for nedstrømstransformationerne. Du kan redigere outputskemaet manuelt, men det er mere praktisk og sikrere at gøre det ved at bruge dataeksemplet.
Derudover kan du på den måde bekræfte, at transformationen fungerer så langt som forventet. For at gøre det skal du åbne Eksempel på data fanen med transformationen valgt og start en forhåndsvisningssession. Når du har bekræftet, at de transformerede data ser ud som forventet, skal du gå til Output skema fanebladet og vælg Brug dataeksempelskema for at opdatere skemaet automatisk.

Når du tilføjer nye former for transformationer, viser forhåndsvisningen muligvis en meddelelse om en manglende afhængighed. Når dette sker, skal du vælge Afslut session og start en ny, så forhåndsvisningen opfanger den nye slags node.

Udtræk instrumentoplysninger

Lad os starte med at behandle oplysningerne om instrumentnavnet for at normalisere det til kolonner, der er lettere at få adgang til i den resulterende outputtabel.

  1. Føj til Split streng node og navngiv den Split instrument, som vil tokenisere instrumentkolonnen ved hjælp af et blanktegnsregex: s+ (et enkelt rum ville gøre det i dette tilfælde, men denne måde er mere fleksibel og visuelt klarere).
  2. Vi ønsker at beholde den originale instrumentinformation, som den er, så indtast et nyt kolonnenavn for det opdelte array: instrument_arr.
    Split config
  3. Tilføj en Array til kolonner node og navngiv den Instrument columns at konvertere den array-kolonne, der netop er oprettet, til nye felter, undtagen symbol, som vi allerede har en kolonne til.
  4. Vælg kolonnen instrument_arr, spring det første token over og bed det om at udtrække outputkolonnerne month, day, year, strike_price, type ved hjælp af indekser 2, 3, 4, 5, 6 (mellemrummene efter kommaerne er for læsbarheden, de påvirker ikke konfigurationen).
    Array config

Det udtrukne år er kun udtrykt med to cifre; lad os sætte en stop for at antage, at det er i dette århundrede, hvis de bare bruger to cifre.

  1. Føj til Afledt kolonne node og navngiv den Four digits year.
  2. Indtast year som den afledte kolonne, så den tilsidesætter den, og indtast følgende SQL-udtryk:
    CASE WHEN length(year) = 2 THEN ('20' || year) ELSE year END
    Årsafledt kolonnekonfiguration

For nemheds skyld bygger vi en expiration_date felt, som en bruger kan have som reference for den sidste dato, optionen kan udnyttes.

  1. Føj til Sammenkæd kolonner node og navngiv den Build expiration date.
  2. Navngiv den nye kolonne expiration_date, vælg kolonnerne year, monthog day (i nævnte rækkefølge), og en bindestreg som spacer.
    Sammenkædet datokonfig

Diagrammet skal indtil videre se ud som det følgende eksempel.

DAG

Dataforhåndsvisningen af ​​de nye kolonner indtil videre skulle se ud som følgende skærmbillede.

Eksempel på data

Normaliser antallet af kontrakter

Hver af rækkerne i dataene angiver antallet af kontrakter for hver option, der blev købt eller solgt, og de partier, hvor ordrerne blev udfyldt. Uden at miste informationen om de enkelte batches, ønsker vi at have hvert beløb på en individuel række med en enkelt mængdeværdi, mens resten af ​​informationen replikeres i hver produceret række.

Lad os først flette beløbene i en enkelt kolonne.

  1. Tilføj en Ophæv pivot kolonner i rækker node og navngiv den Unpivot actions.
  2. Vælg kolonnerne bought , sold at deaktivere og gemme navnene og værdierne i navngivne kolonner action , contracts, henholdsvis.
    Unpivot config
    Bemærk i forhåndsvisningen, at den nye kolonne contracts er stadig en række af tal efter denne transformation.
  1. Tilføj en Eksploder array eller kort i rækker række navngivet Explode contracts.
  2. Vælg den contracts kolonne og indtast contracts som den nye kolonne for at tilsidesætte den (vi behøver ikke at beholde det originale array).

Forhåndsvisningen viser nu, at hver række har en enkelt contracts beløb, og resten af ​​felterne er de samme.

Det betyder også det order_id er ikke længere en unik nøgle. Til dine egne brugstilfælde skal du beslutte, hvordan du modellerer dine data, og om du vil denormalisere eller ej.
Explode config

Følgende skærmbillede er et eksempel på, hvordan de nye kolonner ser ud efter transformationerne indtil videre.
Eksempel på data

Opret en oversigtstabel

Nu opretter du en oversigtstabel med antallet af handlede kontrakter for hver type og hvert aktiesymbol.

Lad os for illustrationsøjemed antage, at de behandlede filer tilhører en enkelt dag, så denne oversigt giver forretningsbrugerne information om, hvad markedsinteressen og stemningen er den dag.

  1. Føj til Vælg felter node og vælg følgende kolonner for at beholde til oversigten: symbol, typeog contracts.
    Udvalgte felter
  2. Føj til Drej rækker til kolonner node og navngiv den Pivot summary.
  3. Saml på contracts kolonne ved hjælp af sum og vælg at konvertere type kolonne.
    Pivot konfig

Normalt ville du gemme det på en ekstern database eller fil til reference; i dette eksempel gemmer vi den som en CSV-fil på Amazon S3.

  1. Tilføj en Autobalancebehandling node og navngiv den Single output file.
  2. Selvom denne transformationstype normalt bruges til at optimere paralleliteten, bruger vi den her til at reducere outputtet til en enkelt fil. Indtast derfor 1 i antallet af partitioner konfiguration.
    Autobalance konfiguration
  3. Tilføj et S3-mål og navngiv det CSV Contract summary.
  4. Vælg CSV som dataformat, og indtast en S3-sti, hvor jobrollen har tilladelse til at gemme filer.

Den sidste del af jobbet skulle nu se ud som det følgende eksempel.
DAG

  1. Gem og kør jobbet. Brug Kører fanen for at kontrollere, hvornår det er afsluttet.
    Du finder en fil under den sti, der er en CSV, på trods af at den ikke har den udvidelse. Du skal sandsynligvis tilføje udvidelsen efter at have downloadet den for at åbne den.
    På et værktøj, der kan læse CSV'en, skal resuméet ligne det følgende eksempel.
    regneark

Ryd op i midlertidige kolonner

Som forberedelse til at gemme ordrerne i en historisk tabel til fremtidig analyse, lad os rydde op i nogle midlertidige kolonner, der er oprettet undervejs.

  1. Føj til Drop felter node med Explode contracts node valgt som sin overordnede (vi forgrener datapipelinen for at generere et separat output).
  2. Vælg de felter, der skal slettes: instrument_arr, month, dayog year.
    Resten ønsker vi at beholde, så de gemmes i den historiske tabel, vi opretter senere.
    Drop felter

Standardisering af valuta

Disse syntetiske data indeholder fiktive operationer på to valutaer, men i et rigtigt system kan du få valutaer fra markeder over hele verden. Det er nyttigt at standardisere de håndterede valutaer til en enkelt referencevaluta, så de nemt kan sammenlignes og aggregeres til rapportering og analyse.

Vi anvender Amazonas Athena at simulere en tabel med omtrentlige valutaomregninger, der bliver opdateret med jævne mellemrum (her antager vi, at vi behandler ordrerne rettidigt nok til, at omregningen er en rimelig repræsentant til sammenligningsformål).

  1. Åbn Athena-konsollen i det samme område, hvor du bruger AWS Glue.
  2. Kør følgende forespørgsel for at oprette tabellen ved at indstille en S3-placering, hvor både dine Athena- og AWS Glue-roller kan læse og skrive. Du vil måske også gerne gemme tabellen i en anden database end default (hvis du gør det, skal du opdatere det tabelkvalificerede navn i overensstemmelse hermed i de angivne eksempler).
    CREATE EXTERNAL TABLE default.exchange_rates(currency string, exchange_rate double)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    STORED AS TEXTFILE
    LOCATION 's3://<enter some bucket>/exchange_rates/';

  3. Indtast et par eksempler på konverteringer i tabellen:
    INSERT INTO default.exchange_rates VALUES ('usd', 1.0), ('eur', 1.09), ('gbp', 1.24);
  4. Du skulle nu være i stand til at se tabellen med følgende forespørgsel:
    SELECT * FROM default.exchange_rates
  5. Tilbage på AWS Glue visuelle job, tilføje en Opslag node (som et barn af Drop Fields) og navngiv det Exchange rate.
  6. Indtast det kvalificerede navn på den tabel, du lige har oprettet, vha currency som tasten og vælg exchange_rate felt at bruge.
    Fordi feltet hedder det samme i både data og opslagstabellen, kan vi bare indtaste navnet currency og behøver ikke at definere en kortlægning.Opslagskonfiguration
    På tidspunktet for skrivningen understøttes Lookup-transformationen ikke i dataeksemplet, og det vil vise en fejl om, at tabellen ikke eksisterer. Dette er kun til forhåndsvisning af data og forhindrer ikke jobbet i at køre korrekt. De få resterende trin i indlægget kræver ikke, at du opdaterer skemaet. Hvis du har brug for at køre et dataeksempel på andre noder, kan du fjerne opslagsknuden midlertidigt og derefter sætte den tilbage.
  7. Føj til Afledt kolonne node og navngiv den Total in usd.
  8. Navngiv den afledte kolonne total_usd og brug følgende SQL-udtryk:
    round(contracts * price * exchange_rate, 2)
    Valutakonverteringskonfig
  9. Føj til Tilføj aktuelt tidsstempel node og navngiv kolonnen ingest_date.
  10. Brug formatet %Y-%m-%d til dit tidsstempel (til demonstrationsformål bruger vi blot datoen; du kan gøre det mere præcist, hvis du vil).
    Tidsstempel konfiguration

Gem tabellen over historiske ordrer

Udfør følgende trin for at gemme tabellen over historiske ordrer:

  1. Tilføj en S3-målknude, og navngiv den Orders table.
  2. Konfigurer Parket-format med hurtig komprimering, og giv en S3-målsti, hvorunder resultaterne kan lagres (adskilt fra oversigten).
  3. Type Opret en tabel i datakataloget og ved efterfølgende kørsler, opdater skemaet og tilføj nye partitioner.
  4. Indtast en måldatabase og et navn til den nye tabel, for eksempel: option_orders.
    Konfiguration af bordvask

Den sidste del af diagrammet skulle nu ligne følgende, med to forgreninger til de to separate udgange.
DAG

Når du har kørt jobbet med succes, kan du bruge et værktøj som Athena til at gennemgå de data, jobbet har produceret, ved at forespørge i den nye tabel. Du kan finde bordet på Athena-listen og vælge Eksempeltabel eller bare kør en SELECT-forespørgsel (ved at opdatere tabelnavnet til det navn og katalog, du brugte):

SELECT * FROM default.option_orders limit 10

Dit tabelindhold skal ligne det følgende skærmbillede.
Tabelindhold

Ryd op

Hvis du ikke vil beholde dette eksempel, skal du slette de to job, du oprettede, de to tabeller i Athena og S3-stierne, hvor input- og outputfilerne blev gemt.

Konklusion

I dette indlæg viste vi, hvordan de nye transformationer i AWS Glue Studio kan hjælpe dig med at lave mere avanceret transformation med minimal konfiguration. Dette betyder, at du kan implementere flere ETL-brugssager uden at skulle skrive og vedligeholde nogen kode. De nye transformationer er allerede tilgængelige på AWS Glue Studio, så du kan bruge de nye transformationer i dag i dine visuelle job.


Om forfatteren

Gonzalo herreros er Senior Big Data Architect på AWS Glue-teamet.

Tidsstempel:

Mere fra AWS Big Data