Tio nya visuella transformationer i AWS Glue Studio

Tio nya visuella transformationer i AWS Glue Studio

Källnod: 2641422

AWS Lim Studio är ett grafiskt gränssnitt som gör det enkelt att skapa, köra och övervaka extrahera, transformera och ladda (ETL) jobb i AWS-lim. Det låter dig visuellt komponera arbetsflöden för datatransformation med hjälp av noder som representerar olika datahanteringssteg, som senare automatiskt omvandlas till kod för att köras.

AWS Lim Studio Nyligen släppt 10 fler visuella transformationer för att skapa mer avancerade jobb på ett visuellt sätt utan kodningsförmåga. I det här inlägget diskuterar vi potentiella användningsfall som återspeglar vanliga ETL-behov.

De nya transformationerna som kommer att demonstreras i det här inlägget är: Sammanfoga, Dela sträng, Array till kolumner, Lägg till aktuell tidsstämpel, Pivot rader till kolumner, Unpivot kolumner till rader, Lookup, Explodera matris eller mappa till kolumner, härledd kolumn och autobalansering. .

Lösningsöversikt

I det här användningsfallet har vi några JSON-filer med aktieoptionsoperationer. Vi vill göra några transformationer innan vi lagrar data för att göra det lättare att analysera, och vi vill också ta fram en separat datamängdssammanfattning.

I denna datauppsättning representerar varje rad en handel med optionskontrakt. Optioner är finansiella instrument som ger rätten – men inte skyldigheten – att köpa eller sälja aktieaktier till ett fast pris (kallad  strejkpris) före ett definierat utgångsdatum.

Indata

Uppgifterna följer följande schema:

  • order_id – Ett unikt ID
  • Symbolen – En kod som vanligtvis baseras på några bokstäver för att identifiera det företag som sänder ut de underliggande aktieaktierna
  • Instrumentet – Namnet som identifierar det specifika alternativet som köps eller säljs
  • valutan – ISO-valutakoden som priset uttrycks i
  • pris – Det belopp som betalades för köpet av varje optionskontrakt (på de flesta börser tillåter ett kontrakt dig att köpa eller sälja 100 aktieaktier)
  • utbyta – Koden för det börscenter eller handelsplats där optionen handlades
  • säljs – En lista över antalet kontrakt som tilldelats för att fylla säljordern när detta är en säljaffär
  • köpt – En lista över antalet kontrakt som tilldelats för att fylla köpordern när detta är köphandel

Följande är ett exempel på den syntetiska data som genereras för detta inlägg:

{"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

Denna data har ett antal unika egenskaper, som ofta finns på äldre system, som gör data svårare att använda.

Följande är ETL-kraven:

  • Instrumentnamnet har värdefull information som är avsedd för människor att förstå; vi vill normalisera det i separata kolumner för enklare analys.
  • Attributen bought och sold utesluter varandra; vi kan konsolidera dem i en enda kolumn med kontraktsnumren och ha en annan kolumn som anger om kontrakten köptes eller såldes i denna ordning.
  • Vi vill behålla informationen om de individuella kontraktstilldelningarna men som enskilda rader istället för att tvinga användare att hantera en rad siffror. Vi skulle kunna lägga ihop siffrorna, men vi skulle förlora information om hur ordern fylldes (vilket indikerar marknadslikviditet). Istället väljer vi att avnormalisera tabellen så att varje rad har ett enda antal kontrakt, och delar upp order med flera nummer i separata rader. I ett komprimerat kolumnformat är den extra datauppsättningsstorleken för denna upprepning ofta liten när komprimering tillämpas, så det är acceptabelt att göra datauppsättningen lättare att fråga.
  • Vi vill generera en sammanfattande tabell över volymer för varje optionstyp (call and put) för varje aktie. Detta ger en indikation på marknadssentimentet för varje aktie och marknaden i allmänhet (girighet kontra rädsla).
  • För att möjliggöra övergripande handelssammanfattningar vill vi för varje operation tillhandahålla totalsumman och standardisera valutan till amerikanska dollar, med hjälp av en ungefärlig omräkningsreferens.
  • Vi vill lägga till datumet när dessa omvandlingar ägde rum. Detta kan till exempel vara användbart för att ha en referens om när valutaomvandlingen gjordes.

Baserat på dessa krav kommer jobbet att ge två utgångar:

  • En CSV-fil med en sammanfattning av antalet kontrakt för varje symbol och typ
  • En katalogtabell för att hålla en historik över beställningen, efter att ha gjort de angivna omvandlingarna
    Dataschema

Förutsättningar

Du behöver din egen S3-hink för att följa med i detta användningsfall. För att skapa en ny hink, se Skapa en hink.

Generera syntetisk data

För att följa med i det här inlägget (eller experimentera med den här typen av data på egen hand), kan du generera denna datauppsättning syntetiskt. Följande Python-skript kan köras i en Python-miljö med Boto3 installerat och tillgång till Amazon enkel lagringstjänst (Amazon S3).

Utför följande steg för att generera data:

  1. På AWS Glue Studio skapar du ett nytt jobb med alternativet Python-skalskriptredigerare.
  2. Ge jobbet ett namn och på Jobb detaljer fliken, välj en lämplig roll och ett namn för Python-skriptet.
  3. I Jobb detaljer avsnitt, expandera Avancerade egenskaper och bläddra ner till Jobbparametrar.
  4. Ange en parameter med namnet --bucket och tilldela som värde namnet på den hink du vill använda för att lagra exempeldata.
  5. Ange följande 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. Kör jobbet och vänta tills det visas som framgångsrikt slutfört på fliken Körningar (det bör ta bara några sekunder).

Varje körning genererar en JSON-fil med 1,000 XNUMX rader under den angivna hinken och prefixet transformsblog/inputdata/. Du kan köra jobbet flera gånger om du vill testa med fler indatafiler.
Varje rad i den syntetiska datan är en datarad som representerar ett JSON-objekt som följande:

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

Skapa AWS Glue visuella jobb

För att skapa AWS Glue visuella jobb, slutför följande steg:

  1. Gå till AWS Glue Studio och skapa ett jobb med alternativet Visual med en tom duk.
  2. Redigera Untitled job att ge den ett namn och tilldela den en roll som lämpar sig för AWS GlueJobb detaljer fliken.
  3. Lägg till en S3-datakälla (du kan namnge den JSON files source) och ange S3-URL under vilken filerna lagras (till exempel, s3://<your bucket name>/transformsblog/inputdata/), välj sedan JSON som dataformat.
  4. Välja Härleda schema så det ställer in utdataschemat baserat på data.

Från den här källnoden fortsätter du att kedja transformeringar. När du lägger till varje transform, se till att den valda noden är den sista som läggs till så att den tilldelas som förälder, om inte annat anges i instruktionerna.

Om du inte valde rätt förälder kan du alltid redigera föräldern genom att välja den och välja en annan förälder i konfigurationsfönstret.

Nodens överordnade konfiguration

För varje nod som läggs till kommer du att ge den ett specifikt namn (så att nodens syfte visas i grafen) och konfiguration på Förvandla fliken.

Varje gång en transformation ändrar schemat (till exempel lägg till en ny kolumn), måste utmatningsschemat uppdateras så att det är synligt för nedströmstransformationerna. Du kan redigera utdataschemat manuellt, men det är mer praktiskt och säkrare att göra det med förhandsgranskningen av data.
På så sätt kan du dessutom verifiera att omvandlingen fungerar så långt som förväntat. För att göra det, öppna Förhandsgranskning av data med omvandlingen vald och starta en förhandsgranskningssession. När du har verifierat att de transformerade data ser ut som förväntat, gå till Utgångsschema fliken och välj Använd schema för förhandsgranskning av data för att uppdatera schemat automatiskt.

När du lägger till nya typer av transformationer kan förhandsgranskningen visa ett meddelande om ett saknat beroende. När detta händer, välj Avsluta session och starta en ny, så förhandsgranskningen tar upp den nya typen av nod.

Extrahera instrumentinformation

Låt oss börja med att ta itu med informationen om instrumentnamnet för att normalisera den till kolumner som är lättare att komma åt i den resulterande utdatatabellen.

  1. Lägg till Delad sträng nod och namnge den Split instrument, som kommer att tokenisera instrumentkolumnen med ett blankstegsregex: s+ (ett enda utrymme skulle göra i det här fallet, men det här sättet är mer flexibelt och visuellt tydligare).
  2. Vi vill behålla den ursprungliga instrumentinformationen som den är, så ange ett nytt kolumnnamn för den delade arrayen: instrument_arr.
    Split config
  3. Lägg till en Array till kolumner nod och namnge den Instrument columns för att konvertera den nyss skapade arraykolumnen till nya fält, förutom symbol, som vi redan har en kolumn för.
  4. Välj kolumnen instrument_arr, hoppa över den första token och be den att extrahera utdatakolumnerna month, day, year, strike_price, type med hjälp av index 2, 3, 4, 5, 6 (mellanslagen efter kommatecken är för läsbarhet, de påverkar inte konfigurationen).
    Array config

Årtalet som extraheras uttrycks endast med två siffror; låt oss sätta ett stopp för att anta att det är i detta århundrade om de bara använder två siffror.

  1. Lägg till Härledd kolumn nod och namnge den Four digits year.
  2. ange year som den härledda kolumnen så att den åsidosätter den och ange följande SQL-uttryck:
    CASE WHEN length(year) = 2 THEN ('20' || year) ELSE year END
    År härledd kolumnkonfiguration

För bekvämlighets skull bygger vi en expiration_date fält som en användare kan ha som referens för det sista datum optionen kan utnyttjas.

  1. Lägg till Sammanfoga kolumner nod och namnge den Build expiration date.
  2. Ge den nya kolumnen ett namn expiration_date, välj kolumnerna year, monthoch day (i den ordningen), och ett bindestreck som spacer.
    Sammanfogad datumkonfiguration

Diagrammet hittills bör se ut som följande exempel.

DAG

Dataförhandsgranskningen av de nya kolumnerna hittills bör se ut som följande skärmdump.

Förhandsgranskning av data

Normalisera antalet kontrakt

Var och en av raderna i data anger antalet kontrakt för varje option som köptes eller såldes och de partier som beställningarna fylldes på. Utan att förlora informationen om de enskilda partierna vill vi ha varje belopp på en enskild rad med ett enda beloppsvärde, medan resten av informationen replikeras i varje producerad rad.

Låt oss först slå samman beloppen till en enda kolumn.

  1. Lägg till en Lossa kolumner i rader nod och namnge den Unpivot actions.
  2. Välj kolumner bought och sold för att avpivotera och lagra namnen och värdena i namngivna kolumner action och contracts, Respektive.
    Unpivot config
    Lägg märke till i förhandsgranskningen att den nya kolumnen contracts är fortfarande en uppsättning siffror efter denna transformation.
  1. Lägg till en Explodera array eller mappa i rader rad namngiven Explode contracts.
  2. Välj contracts kolumn och skriv in contracts som den nya kolumnen för att åsidosätta den (vi behöver inte behålla den ursprungliga arrayen).

Förhandsgranskningen visar nu att varje rad har en singel contracts mängd, och resten av fälten är desamma.

Detta betyder också det order_id är inte längre en unik nyckel. För dina egna användningsfall måste du bestämma hur du ska modellera dina data och om du vill avnormalisera eller inte.
Explodera konfiguration

Följande skärmdump är ett exempel på hur de nya kolumnerna ser ut efter transformationerna hittills.
Förhandsgranskning av data

Skapa en sammanfattningstabell

Nu skapar du en sammanfattningstabell med antalet handlade kontrakt för varje typ och varje aktiesymbol.

Låt oss i illustrationssyfte anta att filerna som behandlas tillhör en enskild dag, så denna sammanfattning ger affärsanvändarna information om vad marknadsintresset och sentimentet är den dagen.

  1. Lägg till Välj fält nod och välj följande kolumner att behålla för sammanfattningen: symbol, typeoch contracts.
    Valda fält
  2. Lägg till Pivotera rader till kolumner nod och namnge den Pivot summary.
  3. Aggregera på contracts kolumn med sum och väljer att konvertera type kolonn.
    Pivotkonfiguration

Normalt skulle du lagra det på någon extern databas eller fil för referens; i det här exemplet sparar vi den som en CSV-fil på Amazon S3.

  1. Lägg till en Autobalansering nod och namnge den Single output file.
  2. Även om den transformeringstypen normalt används för att optimera parallelliteten, använder vi den här för att reducera utdata till en enda fil. Ange därför 1 i antal partitionskonfigurationer.
    Autobalans konfiguration
  3. Lägg till ett S3-mål och namnge det CSV Contract summary.
  4. Välj CSV som dataformat och ange en S3-sökväg där jobbrollen tillåts lagra filer.

Den sista delen av jobbet ska nu se ut som i följande exempel.
DAG

  1. Spara och kör jobbet. Använd Körs fliken för att kontrollera när den är klar.
    Du hittar en fil under den sökvägen som är en CSV, trots att den inte har det tillägget. Du måste förmodligen lägga till tillägget efter att du har laddat ner det för att öppna det.
    På ett verktyg som kan läsa CSV:en bör sammanfattningen se ut ungefär som följande exempel.
    kalkylblad

Rensa upp tillfälliga kolumner

Som förberedelse för att spara beställningarna i en historisk tabell för framtida analys, låt oss rensa upp några tillfälliga kolumner som skapats längs vägen.

  1. Lägg till Släpp fält nod med Explode contracts nod vald som sin förälder (vi förgrenar datapipelinen för att generera en separat utdata).
  2. Välj de fält som ska tas bort: instrument_arr, month, dayoch year.
    Resten vill vi behålla så att de sparas i den historiska tabellen som vi skapar senare.
    Släpp fält

Standardisering av valuta

Denna syntetiska data innehåller fiktiva operationer på två valutor, men i ett riktigt system kan du få valutor från marknader över hela världen. Det är användbart att standardisera de valutor som hanteras till en enda referensvaluta så att de enkelt kan jämföras och aggregeras för rapportering och analys.

Vi använder Amazonas Athena att simulera en tabell med ungefärliga valutaomvandlingar som uppdateras med jämna mellanrum (här antar vi att vi behandlar beställningarna i tid nog att omvandlingen är en rimlig representation för jämförelsesyften).

  1. Öppna Athena-konsolen i samma region där du använder AWS Glue.
  2. Kör följande fråga för att skapa tabellen genom att ställa in en S3-plats där både dina Athena- och AWS Glue-roller kan läsa och skriva. Du kanske också vill lagra tabellen i en annan databas än default (om du gör det, uppdatera det tabellkvalificerade namnet i enlighet med exemplen).
    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. Ange några exempel på konverteringar i tabellen:
    INSERT INTO default.exchange_rates VALUES ('usd', 1.0), ('eur', 1.09), ('gbp', 1.24);
  4. Du bör nu kunna se tabellen med följande fråga:
    SELECT * FROM default.exchange_rates
  5. Tillbaka på AWS Glue visuella jobb, lägg till en Lookup nod (som ett barn till Drop Fields) och namnge det Exchange rate.
  6. Ange det kvalificerade namnet på tabellen du just skapade med currency som tangent och välj exchange_rate fält att använda.
    Eftersom fältet heter samma namn i både data och uppslagstabell kan vi bara ange namnet currency och behöver inte definiera en mappning.Slå upp konfiguration
    När detta skrivs stöds inte Lookup-transformen i dataförhandsgranskningen och den kommer att visa ett felmeddelande om att tabellen inte existerar. Detta är endast för förhandsgranskningen av data och hindrar inte jobbet från att köras korrekt. De få återstående stegen i inlägget kräver inte att du uppdaterar schemat. Om du behöver köra en dataförhandsgranskning på andra noder kan du ta bort uppslagsnoden tillfälligt och sedan lägga tillbaka den.
  7. Lägg till Härledd kolumn nod och namnge den Total in usd.
  8. Namnge den härledda kolumnen total_usd och använd följande SQL-uttryck:
    round(contracts * price * exchange_rate, 2)
    Valutakonverteringskonfig
  9. Lägg till Lägg till aktuell tidsstämpel nod och namnge kolumnen ingest_date.
  10. Använd formatet %Y-%m-%d för din tidsstämpel (i demonstrationssyfte använder vi bara datumet; du kan göra det mer exakt om du vill).
    Tidstämpel konfiguration

Spara den historiska ordertabellen

För att spara den historiska ordertabellen, utför följande steg:

  1. Lägg till en S3-målnod och namnge den Orders table.
  2. Konfigurera Parkettformat med snabb komprimering och tillhandahåll en S3-målväg under vilken du kan lagra resultaten (separat från sammanfattningen).
  3. Välja Skapa en tabell i datakatalogen och vid efterföljande körningar, uppdatera schemat och lägg till nya partitioner.
  4. Ange en måldatabas och ett namn för den nya tabellen, till exempel: option_orders.
    Konfig för bordsdisk

Den sista delen av diagrammet bör nu se ut som följande, med två grenar för de två separata utgångarna.
DAG

När du har kört jobbet framgångsrikt kan du använda ett verktyg som Athena för att granska data som jobbet har producerat genom att fråga den nya tabellen. Du kan hitta tabellen på Athena-listan och välja Förhandsgranska tabellen eller kör bara en SELECT-fråga (uppdatera tabellnamnet till namnet och katalogen du använde):

SELECT * FROM default.option_orders limit 10

Ditt tabellinnehåll bör se ut som på följande skärmdump.
Tabellinnehåll

Städa upp

Om du inte vill behålla det här exemplet, radera de två jobben du skapade, de två tabellerna i Athena och S3-vägarna där in- och utdatafilerna lagrades.

Slutsats

I det här inlägget visade vi hur de nya transformationerna i AWS Glue Studio kan hjälpa dig att göra mer avancerad transformation med minimal konfiguration. Detta innebär att du kan implementera fler ETL-användningsfall utan att behöva skriva och underhålla någon kod. De nya transformationerna är redan tillgängliga på AWS Glue Studio, så du kan använda de nya transformationerna idag i dina visuella jobb.


Om författaren

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

Tidsstämpel:

Mer från AWS Big Data