Ti nye visuelle transformasjoner i AWS Glue Studio

Ti nye visuelle transformasjoner i AWS Glue Studio

Kilde node: 2641422

AWS Lim Studio er et grafisk grensesnitt som gjør det enkelt å opprette, kjøre og overvåke ekstrahere, transformere og laste (ETL) jobber i AWS Lim. Den lar deg komponere datatransformasjonsarbeidsflyter visuelt ved hjelp av noder som representerer forskjellige datahåndteringstrinn, som senere konverteres automatisk til kode for å kjøre.

AWS Lim Studio Nylig utgitt 10 flere visuelle transformasjoner for å tillate å skape mer avanserte jobber på en visuell måte uten kodeferdigheter. I dette innlegget diskuterer vi potensielle brukstilfeller som gjenspeiler vanlige ETL-behov.

De nye transformasjonene som vil bli demonstrert i dette innlegget er: Sammenknytt, Del streng, Array til kolonner, Legg til gjeldende tidsstempel, Pivot rader til kolonner, Unpivot kolonner til rader, oppslag, eksploder matrise eller kart inn i kolonner, avledet kolonne og autobalanseringsbehandling .

Løsningsoversikt

I dette tilfellet har vi noen JSON-filer med aksjeopsjonsoperasjoner. Vi ønsker å gjøre noen transformasjoner før vi lagrer dataene for å gjøre det lettere å analysere, og vi ønsker også å lage et eget datasettsammendrag.

I dette datasettet representerer hver rad en handel med opsjonskontrakter. Opsjoner er finansielle instrumenter som gir rett – men ikke plikt – til å kjøpe eller selge aksjer til en fast pris (kalt  streikepris) før en definert utløpsdato.

Inndata

Dataene følger følgende skjema:

  • Bestillings ID – En unik ID
  • symbol – En kode som vanligvis er basert på noen få bokstaver for å identifisere selskapet som sender ut de underliggende aksjeaksjene
  • instrument – Navnet som identifiserer det spesifikke alternativet som kjøpes eller selges
  • valuta – ISO-valutakoden som prisen er uttrykt i
  • pris – Beløpet som ble betalt for kjøp av hver opsjonskontrakt (på de fleste børser lar én kontrakt deg kjøpe eller selge 100 aksjer)
  • utveksling – Koden til byttesenteret eller stedet der opsjonen ble handlet
  • solgt – En liste over antall kontrakter som ble tildelt for å fylle salgsordren når dette er en salgshandel
  • kjøpt – En liste over antall kontrakter som ble tildelt for å fylle kjøpsordren når dette er kjøpshandel

Følgende er et eksempel på de syntetiske dataene som er generert for dette innlegget:

{"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 dataene har en rekke unike egenskaper, som ofte finnes på eldre systemer, som gjør dataene vanskeligere å bruke.

Følgende er ETL-kravene:

  • Instrumentnavnet har verdifull informasjon som er ment for mennesker å forstå; vi ønsker å normalisere den i separate kolonner for enklere analyse.
  • Attributtene bought og sold utelukker hverandre; vi kan konsolidere dem i en enkelt kolonne med kontraktnumrene og ha en annen kolonne som indikerer om kontraktene ble kjøpt eller solgt i denne rekkefølgen.
  • Vi ønsker å beholde informasjonen om de individuelle kontraktstildelingene, men som individuelle rader i stedet for å tvinge brukere til å forholde seg til en rekke tall. Vi kunne legge sammen tallene, men vi ville miste informasjon om hvordan ordren ble fylt (som indikerer markedslikviditet). I stedet velger vi å denormalisere tabellen slik at hver rad har et enkelt antall kontrakter, og deler opp ordre med flere tall i separate rader. I et komprimert kolonneformat er den ekstra datasettstørrelsen for denne repetisjonen ofte liten når komprimering brukes, så det er akseptabelt å gjøre datasettet enklere å spørre etter.
  • Vi ønsker å generere en oppsummeringstabell over volum for hver opsjonstype (call and put) for hver aksje. Dette gir en indikasjon på markedssentimentet for hver aksje og markedet generelt (grådighet vs. frykt).
  • For å aktivere overordnede handelssammendrag ønsker vi å gi totalsummen for hver operasjon og standardisere valutaen til amerikanske dollar ved å bruke en omtrentlig konverteringsreferanse.
  • Vi ønsker å legge til datoen da disse transformasjonene fant sted. Dette kan for eksempel være nyttig for å ha en referanse på når valutaomregningen ble foretatt.

Basert på disse kravene vil jobben produsere to utganger:

  • En CSV-fil med en oppsummering av antall kontrakter for hvert symbol og type
  • En katalogtabell for å holde en historikk over bestillingen, etter å ha utført de angitte transformasjonene
    Dataskjema

Forutsetninger

Du trenger din egen S3-bøtte for å følge med denne brukssaken. For å lage en ny bøtte, se Å lage en bøtte.

Generer syntetiske data

For å følge med på dette innlegget (eller eksperimentere med denne typen data på egen hånd), kan du generere dette datasettet syntetisk. Følgende Python-skript kan kjøres på et Python-miljø med Boto3 installert og tilgang til Amazon enkel lagringstjeneste (Amazon S3).

For å generere data, fullfør følgende trinn:

  1. På AWS Glue Studio oppretter du en ny jobb med alternativet Python shell script editor.
  2. Gi jobben et navn og på Jobbdetaljer fanen, velg en passende rolle og et navn for Python-skriptet.
  3. Jobbdetaljer seksjon, utvide Avanserte egenskaper og bla ned til Jobbparametere.
  4. Skriv inn en parameter kalt --bucket og tilordne som verdi navnet på bøtten du vil bruke til å lagre eksempeldataene.
  5. Skriv inn følgende skript i AWS Glue shell editor:
    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. Kjør jobben og vent til den vises som vellykket fullført på Kjør-fanen (det bør ta bare noen få sekunder).

Hver kjøring vil generere en JSON-fil med 1,000 rader under den angitte bøtten og prefikset transformsblog/inputdata/. Du kan kjøre jobben flere ganger hvis du vil teste med flere inndatafiler.
Hver linje i de syntetiske dataene er en datarad som representerer 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]
}

Lag AWS Glue visuell jobb

For å lage den visuelle AWS Glue-jobben, fullfør følgende trinn:

  1. Gå til AWS Glue Studio og opprett en jobb ved å bruke alternativet Visuelt med et tomt lerret.
  2. Rediger Untitled job å gi den et navn og tildele en rolle som passer for AWS GlueJobbdetaljer fanen.
  3. Legg til en S3-datakilde (du kan navngi den JSON files source) og skriv inn S3-URLen som filene er lagret under (f.eks. s3://<your bucket name>/transformsblog/inputdata/), velg deretter JSON som dataformat.
  4. Plukke ut Utlede skjema så det setter utdataskjemaet basert på dataene.

Fra denne kildenoden vil du fortsette å lenke transformasjoner. Når du legger til hver transformasjon, sørg for at den valgte noden er den siste som er lagt til, slik at den blir tildelt som overordnet, med mindre annet er angitt i instruksjonene.

Hvis du ikke valgte riktig forelder, kan du alltid redigere forelderen ved å velge den og velge en annen forelder i konfigurasjonsruten.

Node overordnet konfigurasjon

For hver node som legges til, vil du gi den et spesifikt navn (slik at formålet med noden vises i grafen) og konfigurasjon på Transform fanen.

Hver gang en transformasjon endrer skjemaet (for eksempel legge til en ny kolonne), må utdataskjemaet oppdateres slik at det er synlig for nedstrømstransformasjonene. Du kan redigere utdataskjemaet manuelt, men det er mer praktisk og tryggere å gjøre det ved å bruke forhåndsvisningen av data.
I tillegg kan du på den måten bekrefte at transformasjonen fungerer så langt som forventet. For å gjøre det, åpne Forhåndsvisning av data fanen med transformasjonen valgt og start en forhåndsvisningsøkt. Etter at du har bekreftet at de transformerte dataene ser ut som forventet, går du til Utdataskjema fanen og velg Bruk dataforhåndsvisningsskjema for å oppdatere skjemaet automatisk.

Når du legger til nye typer transformasjoner, kan forhåndsvisningen vise en melding om en manglende avhengighet. Når dette skjer, velg Avslutt sesjonen og start en ny, så forhåndsvisningen fanger opp den nye typen node.

Trekk ut instrumentinformasjon

La oss starte med å behandle informasjonen om instrumentnavnet for å normalisere det til kolonner som er lettere å få tilgang til i den resulterende utdatatabellen.

  1. legge en Delt streng node og navngi den Split instrument, som vil tokenisere instrumentkolonnen ved å bruke et regeluttrykk for mellomrom: s+ (en enkelt plass ville gjøre i dette tilfellet, men denne måten er mer fleksibel og visuelt klarere).
  2. Vi ønsker å beholde den originale instrumentinformasjonen som den er, så skriv inn et nytt kolonnenavn for den delte arrayen: instrument_arr.
    Del konfig
  3. Legg til en Array til kolonner node og navngi den Instrument columns for å konvertere array-kolonnen som nettopp er opprettet til nye felt, bortsett fra symbol, som vi allerede har en kolonne for.
  4. Velg kolonnen instrument_arr, hopp over det første tokenet og be det trekke ut utdatakolonnene month, day, year, strike_price, type ved hjelp av indekser 2, 3, 4, 5, 6 (mellomrommene etter kommaene er for lesbarhet, de påvirker ikke konfigurasjonen).
    Array konfig

Årstallet som trekkes ut uttrykkes kun med to sifre; la oss sette et stopp for å anta at det er i dette århundret hvis de bare bruker to sifre.

  1. legge en Avledet kolonne node og navngi den Four digits year.
  2. Enter year som den avledede kolonnen slik at den overstyrer den, og skriv inn følgende SQL-uttrykk:
    CASE WHEN length(year) = 2 THEN ('20' || year) ELSE year END
    Årsavledet kolonnekonfig

For enkelhets skyld bygger vi en expiration_date felt som en bruker kan ha som referanse for siste dato opsjonen kan utøves.

  1. legge en Slå sammen kolonner node og navngi den Build expiration date.
  2. Gi den nye kolonnen et navn expiration_date, velg kolonnene year, monthog day (i den rekkefølgen), og en bindestrek som spacer.
    Sammenhengt datokonfig

Diagrammet så langt skal se ut som følgende eksempel.

DAG

Dataforhåndsvisningen av de nye kolonnene så langt skal se ut som følgende skjermbilde.

Forhåndsvisning av data

Normaliser antall kontrakter

Hver av radene i dataene indikerer antall kontrakter for hver opsjon som ble kjøpt eller solgt og batchene som ordrene ble fylt på. Uten å miste informasjonen om de enkelte partiene, ønsker vi å ha hvert beløp på en enkelt rad med en enkelt beløpsverdi, mens resten av informasjonen replikeres i hver produserte rad.

La oss først slå sammen beløpene til en enkelt kolonne.

  1. Legg til en Løsne kolonner i rader node og navngi den Unpivot actions.
  2. Velg kolonnene bought og sold for å oppheve og lagre navnene og verdiene i navngitte kolonner action og contractsHhv.
    Fjern pivot konfig
    Legg merke til i forhåndsvisningen at den nye kolonnen contracts er fortsatt en rekke tall etter denne transformasjonen.
  1. Legg til en Eksploder array eller kart i rader rad navngitt Explode contracts.
  2. Velg contracts kolonne og skriv inn contracts som den nye kolonnen for å overstyre den (vi trenger ikke å beholde den opprinnelige matrisen).

Forhåndsvisningen viser nå at hver rad har en singel contracts beløp, og resten av feltene er de samme.

Dette betyr også at order_id er ikke lenger en unik nøkkel. For dine egne brukstilfeller må du bestemme hvordan du skal modellere dataene dine og om du vil denormalisere eller ikke.
Explode config

Følgende skjermbilde er et eksempel på hvordan de nye kolonnene ser ut etter transformasjonene så langt.
Forhåndsvisning av data

Lag en sammendragstabell

Nå lager du en oppsummeringstabell med antall kontrakter omsatt for hver type og hvert aksjesymbol.

La oss anta for illustrasjonsformål at filene som behandles tilhører en enkelt dag, så dette sammendraget gir bedriftsbrukerne informasjon om hva markedsinteressen og sentimentet er den dagen.

  1. legge en Velg felt node og velg følgende kolonner for å beholde for sammendraget: symbol, typeog contracts.
    Valgte felt
  2. legge en Pivoter rader til kolonner node og navngi den Pivot summary.
  3. Samle på contracts kolonne ved hjelp av sum og velg å konvertere type kolonne.
    Pivot konfig

Normalt vil du lagre det på en ekstern database eller fil for referanse; i dette eksemplet lagrer vi den som en CSV-fil på Amazon S3.

  1. Legg til en Autobalansebehandling node og navngi den Single output file.
  2. Selv om den transformasjonstypen vanligvis brukes til å optimalisere parallelliteten, bruker vi den her til å redusere utdataene til en enkelt fil. Gå derfor inn 1 i antall partisjoner konfigurasjon.
    Autobalanse konfig
  3. Legg til et S3-mål og navngi det CSV Contract summary.
  4. Velg CSV som dataformat og angi en S3-bane der jobbrollen har lov til å lagre filer.

Den siste delen av jobben skal nå se ut som følgende eksempel.
DAG

  1. Lagre og kjør jobben. Bruke Kjører fanen for å sjekke når den er fullført.
    Du finner en fil under den banen som er en CSV, til tross for at du ikke har den utvidelsen. Du må sannsynligvis legge til utvidelsen etter at du har lastet den ned for å åpne den.
    På et verktøy som kan lese CSV-en, skal sammendraget se omtrent ut som følgende eksempel.
    regneark

Rydd opp i midlertidige kolonner

Som forberedelse til å lagre bestillingene i en historisk tabell for fremtidig analyse, la oss rydde opp i noen midlertidige kolonner som ble opprettet underveis.

  1. legge en Slipp felt node med Explode contracts node valgt som overordnet (vi forgrener datarørledningen for å generere en separat utgang).
  2. Velg feltene som skal slettes: instrument_arr, month, dayog year.
    Resten ønsker vi å beholde slik at de blir lagret i den historiske tabellen vi lager senere.
    Slipp felt

Valutastandardisering

Disse syntetiske dataene inneholder fiktive operasjoner på to valutaer, men i et ekte system kan du få valutaer fra markeder over hele verden. Det er nyttig å standardisere valutaene som håndteres til én enkelt referansevaluta, slik at de enkelt kan sammenlignes og aggregeres for rapportering og analyse.

Vi bruker Amazonas Athena å simulere en tabell med omtrentlige valutaomregninger som oppdateres med jevne mellomrom (her antar vi at vi behandler bestillingene i tide nok til at konverteringen er en rimelig representant for sammenligningsformål).

  1. Åpne Athena-konsollen i samme region der du bruker AWS Glue.
  2. Kjør følgende spørring for å lage tabellen ved å angi en S3-plassering der både Athena- og AWS Glue-rollene dine kan lese og skrive. Det kan også være lurt å lagre tabellen i en annen database enn default (hvis du gjør det, oppdater det tabellkvalifiserte navnet tilsvarende i eksemplene som er gitt).
    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. Skriv inn noen eksempler på konverteringer i tabellen:
    INSERT INTO default.exchange_rates VALUES ('usd', 1.0), ('eur', 1.09), ('gbp', 1.24);
  4. Du skal nå kunne se tabellen med følgende spørring:
    SELECT * FROM default.exchange_rates
  5. Tilbake på AWS Glue visuell jobb, legg til en Oppslag node (som et barn av Drop Fields) og nevne det Exchange rate.
  6. Skriv inn det kvalifiserte navnet på tabellen du nettopp opprettet ved å bruke currency som tast og velg exchange_rate felt å bruke.
    Fordi feltet heter det samme i både dataene og oppslagstabellen, kan vi bare skrive inn navnet currency og trenger ikke å definere en kartlegging.Slå opp konfig
    Når dette skrives, støttes ikke oppslagstransformasjonen i dataforhåndsvisningen, og den vil vise en feil om at tabellen ikke eksisterer. Dette er kun for forhåndsvisningen av data og forhindrer ikke at jobben kjører riktig. De få gjenværende trinnene i innlegget krever ikke at du oppdaterer skjemaet. Hvis du trenger å kjøre en forhåndsvisning av data på andre noder, kan du fjerne oppslagsnoden midlertidig og deretter sette den tilbake.
  7. legge en Avledet kolonne node og navngi den Total in usd.
  8. Gi navn til den avledede kolonnen total_usd og bruk følgende SQL-uttrykk:
    round(contracts * price * exchange_rate, 2)
    Valutakonverteringskonfig
  9. legge en Legg til gjeldende tidsstempel node og navngi kolonnen ingest_date.
  10. Bruk formatet %Y-%m-%d for tidsstemplet ditt (for demonstrasjonsformål bruker vi bare datoen; du kan gjøre den mer presis hvis du vil).
    Tidsstempelkonfig

Lagre den historiske ordretabellen

For å lagre den historiske ordretabellen, fullfør følgende trinn:

  1. Legg til en S3-målnode og navngi den Orders table.
  2. Konfigurer Parkett-format med rask komprimering, og gi en S3-målbane som du kan lagre resultatene under (atskilt fra sammendraget).
  3. Plukke ut Opprett en tabell i datakatalogen og ved påfølgende kjøringer, oppdater skjemaet og legg til nye partisjoner.
  4. Skriv inn en måldatabase og et navn for den nye tabellen, for eksempel: option_orders.
    Konfigurasjon av bordvask

Den siste delen av diagrammet skal nå se ut som det følgende, med to grener for de to separate utgangene.
DAG

Etter at du har kjørt jobben, kan du bruke et verktøy som Athena til å se gjennom dataene jobben har produsert ved å spørre etter den nye tabellen. Du kan finne tabellen på Athena-listen og velge Forhåndsvisningstabell eller bare kjør en SELECT-spørring (oppdaterer tabellnavnet til navnet og katalogen du brukte):

SELECT * FROM default.option_orders limit 10

Tabellinnholdet ditt skal se ut som det følgende skjermbildet.
Tabellinnhold

Rydd opp

Hvis du ikke vil beholde dette eksemplet, sletter du de to jobbene du opprettet, de to tabellene i Athena og S3-banene der inn- og utdatafilene ble lagret.

konklusjonen

I dette innlegget viste vi hvordan de nye transformasjonene i AWS Glue Studio kan hjelpe deg med å gjøre mer avansert transformasjon med minimum konfigurasjon. Dette betyr at du kan implementere flere ETL-brukssaker uten å måtte skrive og vedlikeholde noen kode. De nye transformasjonene er allerede tilgjengelige på AWS Glue Studio, så du kan bruke de nye transformasjonene i dag i dine visuelle jobber.


Om forfatteren

Gonzalo Herreros er senior Big Data Architect på AWS Glue-teamet.

Tidstempel:

Mer fra AWS Big Data