Deset novih vizualnih transformacij v AWS Glue Studio

Deset novih vizualnih transformacij v AWS Glue Studio

Izvorno vozlišče: 2641422

AWS Glue Studio je grafični vmesnik, ki olajša ustvarjanje, izvajanje in spremljanje opravil ekstrahiranja, preoblikovanja in nalaganja (ETL) v AWS lepilo. Omogoča vam vizualno sestavljanje delovnih tokov preoblikovanja podatkov z uporabo vozlišč, ki predstavljajo različne korake za obdelavo podatkov, ki se pozneje samodejno pretvorijo v kodo za izvajanje.

AWS Glue Studio pred kratkim izdal Še 10 vizualnih transformacij, ki omogočajo ustvarjanje naprednejših delovnih mest na vizualni način brez spretnosti kodiranja. V tej objavi razpravljamo o možnih primerih uporabe, ki odražajo običajne potrebe ETL.

Nove transformacije, ki bodo prikazane v tej objavi, so: združevanje, razdelitev niza, matrika v stolpce, dodajanje trenutnega časovnega žiga, zasukanje vrstic v stolpce, razveljavitev zasuka stolpcev v vrstice, iskanje, razstrelitev matrike ali preslikava v stolpce, izpeljani stolpec in obdelava samodejnega uravnavanja .

Pregled rešitev

V tem primeru uporabe imamo nekaj datotek JSON z operacijami delniških opcij. Pred shranjevanjem podatkov želimo narediti nekaj transformacij, da jih bomo lažje analizirali, poleg tega pa želimo ustvariti ločen povzetek nabora podatkov.

V tem naboru podatkov vsaka vrstica predstavlja trgovanje opcijskih pogodb. Opcije so finančni instrumenti, ki zagotavljajo pravico – vendar ne obveznosti – do nakupa ali prodaje delnic po fiksni ceni (imenovani  cena stavke) pred določenim datumom poteka.

Vhodni podatki

Podatki sledijo naslednji shemi:

  • Številka naročila – Edinstven ID
  • Simbol – Koda, ki običajno temelji na nekaj črkah za identifikacijo korporacije, ki izda osnovne delnice
  • instrument – Ime, ki označuje določeno možnost, ki se kupuje ali prodaja
  • valuta – Koda valute ISO, v kateri je izražena cena
  • Cena – Znesek, ki je bil plačan za nakup vsake opcijske pogodbe (na večini borz ena pogodba omogoča nakup ali prodajo 100 delniških delnic)
  • Izmenjava – Koda borznega središča ali mesta, kjer se je trgovalo z opcijo
  • prodaja – Seznam števila pogodb, ki so bile dodeljene za izpolnitev prodajnega naročila, ko je to prodajna trgovina
  • Kupil – Seznam števila pogodb, ki so bile dodeljene za izpolnitev nakupnega naročila, ko gre za nakupno trgovanje

Sledi vzorec sintetičnih podatkov, ustvarjenih za to objavo:

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

Zahteve ETL

Ti podatki imajo številne edinstvene lastnosti, kot jih pogosto najdemo v starejših sistemih, zaradi katerih je težje uporabiti podatke.

Zahteve ETL so naslednje:

  • Ime instrumenta vsebuje dragocene informacije, ki so namenjene razumevanju ljudi; želimo ga normalizirati v ločene stolpce za lažjo analizo.
  • Atributi bought in sold se med seboj izključujejo; lahko jih združimo v en sam stolpec s številkami pogodb in imamo še en stolpec, ki označuje, ali so bile pogodbe kupljene ali prodane v tem vrstnem redu.
  • Podatke o dodelitvah posameznih pogodb želimo obdržati, vendar kot posamezne vrstice, namesto da bi uporabnike silili, da se ukvarjajo z nizom številk. Lahko bi sešteli številke, vendar bi izgubili informacijo o tem, kako je bilo naročilo izpolnjeno (kar kaže na likvidnost trga). Namesto tega se odločimo za denormalizacijo tabele, tako da ima vsaka vrstica eno samo število pogodb, pri čemer naročila z več številkami razdelimo v ločene vrstice. V stisnjenem stolpčnem formatu je dodatna velikost nabora podatkov tega ponavljanja pogosto majhna, ko je uporabljeno stiskanje, zato je sprejemljivo, da je nabor podatkov lažji za poizvedovanje.
  • Ustvariti želimo zbirno tabelo obsega za vsako vrsto opcije (call in put) za vsako delnico. To je pokazatelj razpoloženja trga za vsako delnico in trg na splošno (pohlep proti strahu).
  • Da bi omogočili splošne trgovinske povzetke, želimo za vsako operacijo zagotoviti skupno vsoto in standardizirati valuto v ameriške dolarje z uporabo približne reference pretvorbe.
  • Želimo dodati datum, ko so se te preobrazbe zgodile. To bi lahko bilo koristno na primer za sklic na to, kdaj je bila izvedena pretvorba valute.

Na podlagi teh zahtev bo opravilo ustvarilo dva rezultata:

  • Datoteka CSV s povzetkom števila pogodb za vsak simbol in vrsto
  • Kataloška tabela za vodenje zgodovine naročil po izvedbi navedenih transformacij
    Podatkovna shema

Predpogoji

Za ta primer uporabe boste potrebovali lastno vedro S3. Če želite ustvariti novo vedro, glejte Ustvarjanje vedra.

Ustvari sintetične podatke

Če želite slediti tej objavi (ali sami eksperimentirati s to vrsto podatkov), lahko sintetično ustvarite ta nabor podatkov. Naslednji skript Python je mogoče izvajati v okolju Python z nameščenim Boto3 in dostopom do njega Preprosta storitev shranjevanja Amazon (Amazon S3).

Če želite ustvariti podatke, izvedite naslednje korake:

  1. V AWS Glue Studio ustvarite novo opravilo z možnostjo Urejevalnik skriptov lupine Python.
  2. Poimenujte delo in na Podrobnosti o delovnem mestu zavihek izberite a primerno vlogo in ime za skript Python.
  3. v Podrobnosti o delovnem mestu razdelek, razširi Napredne lastnosti in se pomaknite navzdol do Parametri delovnega mesta.
  4. Vnesite parameter z imenom --bucket in kot vrednost dodelite ime vedra, ki ga želite uporabiti za shranjevanje vzorčnih podatkov.
  5. Vnesite naslednji skript v urejevalnik lupine AWS Glue:
    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. Zaženite opravilo in počakajte, da se na zavihku Izvajanja prikaže kot uspešno dokončano (trajalo bi le nekaj sekund).

Vsak zagon bo ustvaril datoteko JSON s 1,000 vrsticami pod navedenim vedro in predpono transformsblog/inputdata/. Posel lahko zaženete večkrat, če želite preizkusiti z več vhodnimi datotekami.
Vsaka vrstica v sintetičnih podatkih je podatkovna vrstica, ki predstavlja objekt JSON, kot je ta:

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

Ustvarite vizualno opravilo AWS Glue

Če želite ustvariti vizualno opravilo AWS Glue, dokončajte naslednje korake:

  1. Pojdite v AWS Glue Studio in ustvarite opravilo z možnostjo Vizualno s praznim platnom.
  2. Uredi Untitled job da ga poimenujete in dodelite vlogo, primerno za lepilo AWS o Podrobnosti o delovnem mestu tab.
  3. Dodajte vir podatkov S3 (lahko ga poimenujete JSON files source) in vnesite URL S3, pod katerim so shranjene datoteke (npr. s3://<your bucket name>/transformsblog/inputdata/), nato izberite JSON kot format podatkov.
  4. Izberite Sklepaj shemo zato nastavi izhodno shemo na podlagi podatkov.

Iz tega izvornega vozlišča boste še naprej verižili transformacije. Ko dodajate vsako transformacijo, se prepričajte, da je izbrano vozlišče zadnje dodano, da bo dodeljeno kot nadrejeno, razen če je v navodilih navedeno drugače.

Če niste izbrali pravega nadrejenega elementa, ga lahko vedno uredite tako, da ga izberete in v konfiguracijskem podoknu izberete drugega nadrejenega elementa.

Nadrejena konfiguracija vozlišča

Za vsako dodano vozlišče boste dali posebno ime (tako da je namen vozlišča prikazan na grafu) in konfiguracijo na Transform tab.

Vsakič, ko pretvorba spremeni shemo (na primer doda nov stolpec), je treba izhodno shemo posodobiti, tako da je vidna nadaljnjim pretvorbam. Izhodno shemo lahko uredite ročno, vendar je bolj praktično in varneje, če to storite s predogledom podatkov.
Poleg tega lahko na ta način preverite, ali transformacija deluje tako daleč, kot je bilo pričakovano. Če želite to narediti, odprite Predogled podatkov z izbrano transformacijo in začnite sejo predogleda. Ko preverite, ali so preoblikovani podatki videti po pričakovanjih, pojdite na Izhodna shema zavihek in izberite Uporabi shemo predogleda podatkov za samodejno posodobitev sheme.

Ko dodate nove vrste transformacij, se lahko v predogledu prikaže sporočilo o manjkajoči odvisnosti. Ko se to zgodi, izberite Končaj sejo in začnite novo, tako da predogled pobere novo vrsto vozlišča.

Izvleček informacij o instrumentu

Začnimo z obravnavanjem informacij o imenu instrumenta, da ga normaliziramo v stolpce, ki so lažje dostopni v nastali izhodni tabeli.

  1. Dodaj Razcepljena vrvica vozlišče in ga poimenujte Split instrument, ki bo tokeniziral stolpec instrumenta z uporabo regularnega izraza presledka: s+ (v tem primeru bi zadostoval en sam presledek, vendar je ta način bolj prilagodljiv in vizualno preglednejši).
  2. Izvirne informacije o instrumentu želimo ohraniti takšne, kot so, zato vnesite novo ime stolpca za razdeljeno matriko: instrument_arr.
    Razdeljena konfiguracija
  3. Dodajanje Niz v stolpce vozlišče in ga poimenujte Instrument columns za pretvorbo pravkar ustvarjenega stolpca matrike v nova polja, razen za symbol, za katerega že imamo rubriko.
  4. Izberite stolpec instrument_arr, preskočite prvi žeton in mu recite, naj izvleče izhodne stolpce month, day, year, strike_price, type z uporabo indeksov 2, 3, 4, 5, 6 (presledki za vejicami so za berljivost, ne vplivajo na konfiguracijo).
    Konfiguracija polja

Izvlečeno leto je izraženo le z dvema števkama; postavimo začasno vrzel in predpostavimo, da je v tem stoletju, če uporabljajo le dve števki.

  1. Dodaj Izpeljani stolpec vozlišče in ga poimenujte Four digits year.
  2. Vnesite year kot izpeljani stolpec, tako da ga preglasi, in vnesite naslednji izraz SQL:
    CASE WHEN length(year) = 2 THEN ('20' || year) ELSE year END
    Leto izpeljana konfiguracija stolpca

Za udobje izdelamo expiration_date polje, ki ga ima lahko uporabnik kot sklic na zadnji datum, ko je možnost uveljaviti.

  1. Dodaj Poveži stolpce vozlišče in ga poimenujte Build expiration date.
  2. Poimenujte nov stolpec expiration_date, izberite stolpce year, monthin day (v tem vrstnem redu) in vezaj kot presledek.
    Sestavljena konfiguracija datuma

Dosedanji diagram bi moral izgledati kot naslednji primer.

DAG

Dosedanji predogled podatkov novih stolpcev bi moral izgledati kot naslednji posnetek zaslona.

Predogled podatkov

Normalizirajte število pogodb

Vsaka od vrstic v podatkih označuje število pogodb vsake opcije, ki so bile kupljene ali prodane, in sklope, na katerih so bila naročila izpolnjena. Ne da bi izgubili informacije o posameznih serijah, želimo imeti vsako količino v posamezni vrstici z eno samo vrednostjo količine, medtem ko se ostale informacije ponovijo v vsaki proizvedeni vrstici.

Najprej združimo zneske v en stolpec.

  1. Dodajanje Prekliči vrtenje stolpcev v vrstice vozlišče in ga poimenujte Unpivot actions.
  2. Izberite stolpce bought in sold za odmik in shranjevanje imen in vrednosti v poimenovanih stolpcih action in contractsOz.
    Odstrani zasukanje konfiguracije
    V predogledu opazite, da novi stolpec contracts je po tej transformaciji še vedno niz števil.
  1. Dodajanje Razčlenite niz ali preslikajte v vrstice vrstica z imenom Explode contracts.
  2. Izberite contracts stolpec in vnesite contracts kot nov stolpec, da ga preglasimo (ni nam treba obdržati izvirne matrike).

Predogled zdaj kaže, da ima vsaka vrstica enega contracts znesek, ostala polja pa so enaka.

To tudi pomeni, da order_id ni več edinstven ključ. Za lastne primere uporabe se morate odločiti, kako modelirati podatke in ali jih želite denormalizirati ali ne.
Razstreli konfiguracijo

Naslednji posnetek zaslona je primer, kako izgledajo novi stolpci po dosedanjih transformacijah.
Predogled podatkov

Ustvarite zbirno tabelo

Sedaj ustvarite zbirno tabelo s številom pogodb, s katerimi se trguje za vsako vrsto in vsak delniški simbol.

Za ponazoritev predpostavimo, da obdelane datoteke pripadajo enemu dnevu, tako da ta povzetek daje poslovnim uporabnikom informacije o tem, kakšen je tržni interes in razpoloženje tisti dan.

  1. Dodaj Izberite Polja vozlišče in izberite naslednje stolpce, ki jih želite obdržati za povzetek: symbol, typein contracts.
    Izbrana polja
  2. Dodaj Vrti vrstice v stolpce vozlišče in ga poimenujte Pivot summary.
  3. Agregat na contracts uporaba stolpca sum in izberite pretvorbo type stolpec.
    Pivot config

Običajno bi ga shranili v zunanjo bazo podatkov ali datoteko za referenco; v tem primeru ga shranimo kot datoteko CSV na Amazon S3.

  1. Dodajanje Obdelava samodejnega uravnoteženja vozlišče in ga poimenujte Single output file.
  2. Čeprav se ta vrsta pretvorbe običajno uporablja za optimizacijo vzporednosti, jo tukaj uporabljamo za zmanjšanje izhoda na eno datoteko. Zato vstopite 1 v konfiguraciji števila particij.
    Konfiguracija samodejnega ravnovesja
  3. Dodajte cilj S3 in ga poimenujte CSV Contract summary.
  4. Za format podatkov izberite CSV in vnesite pot S3, kjer lahko vloga službe shranjuje datoteke.

Zadnji del opravila bi zdaj moral izgledati kot naslednji primer.
DAG

  1. Shranite in zaženite opravilo. Uporabi Teče zavihek, da preverite, kdaj se je uspešno končalo.
    Pod to potjo boste našli datoteko, ki je CSV, čeprav nima te pripone. Verjetno boste morali razširitev dodati, ko jo prenesete, da jo odprete.
    V orodju, ki lahko bere CSV, bi moral biti povzetek videti nekako tako kot naslednji primer.
    Spreadsheet

Očistite začasne stolpce

V pripravah na shranjevanje naročil v zgodovinsko tabelo za prihodnjo analizo počistimo nekaj začasnih stolpcev, ustvarjenih na poti.

  1. Dodaj Spustite polja vozlišče z Explode contracts vozlišče, izbrano kot nadrejeno (podatkovni cevovod razvejamo, da ustvarimo ločen izhod).
  2. Izberite polja, ki jih želite izpustiti: instrument_arr, month, dayin year.
    Ostale želimo obdržati, da se shranijo v zgodovinsko tabelo, ki jo bomo ustvarili pozneje.
    Spusti polja

Standardizacija valut

Ti sintetični podatki vsebujejo izmišljene operacije na dveh valutah, toda v resničnem sistemu lahko dobite valute s trgov po vsem svetu. Koristno je standardizirati obravnavane valute v eno referenčno valuto, da jih je mogoče preprosto primerjati in združevati za poročanje in analizo.

Mi uporabljamo Amazonska Atena za simulacijo tabele s približnimi pretvorbami valut, ki se redno posodablja (tukaj predvidevamo, da naročila obdelujemo dovolj pravočasno, da je pretvorba razumen predstavnik za namene primerjave).

  1. Odprite konzolo Athena v isti regiji, kjer uporabljate AWS Glue.
  2. Zaženite naslednjo poizvedbo, da ustvarite tabelo tako, da nastavite lokacijo S3, kjer lahko vaši vlogi Athena in AWS Glue bereta in pišeta. Poleg tega boste morda želeli shraniti tabelo v drugo zbirko podatkov default (če to storite, ustrezno posodobite kvalificirano ime tabele v navedenih primerih).
    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. V tabelo vnesite nekaj vzorčnih konverzij:
    INSERT INTO default.exchange_rates VALUES ('usd', 1.0), ('eur', 1.09), ('gbp', 1.24);
  4. Zdaj bi si lahko ogledali tabelo z naslednjo poizvedbo:
    SELECT * FROM default.exchange_rates
  5. Nazaj na vizualno opravilo AWS Glue dodajte a Iskanje vozlišče (kot otrok Drop Fields) in ga poimenujte Exchange rate.
  6. Vnesite kakovostno ime tabele, ki ste jo pravkar ustvarili, z uporabo currency kot ključ in izberite exchange_rate polje za uporabo.
    Ker je polje enako poimenovano tako v podatkih kot v iskalni tabeli, lahko samo vnesemo ime currency in ni treba definirati preslikave.Konfiguracija iskanja
    V času tega pisanja pretvorba iskanja ni podprta v predogledu podatkov in prikazala bo napako, da tabela ne obstaja. To je samo za predogled podatkov in ne preprečuje pravilnega izvajanja opravila. Nekaj ​​preostalih korakov objave ne zahteva, da posodobite shemo. Če morate zagnati predogled podatkov na drugih vozliščih, lahko vozlišče za iskanje začasno odstranite in ga nato postavite nazaj.
  7. Dodaj Izpeljani stolpec vozlišče in ga poimenujte Total in usd.
  8. Poimenujte izpeljani stolpec total_usd in uporabite naslednji izraz SQL:
    round(contracts * price * exchange_rate, 2)
    Konfiguracija pretvorbe valut
  9. Dodaj Dodajte trenutni časovni žig vozlišče in poimenujte stolpec ingest_date.
  10. Uporabite obliko %Y-%m-%d za vaš časovni žig (za namene predstavitve uporabljamo le datum; če želite, ga lahko naredite natančnejšega).
    Konfiguracija časovnega žiga

Shranite tabelo zgodovinskih naročil

Če želite shraniti tabelo zgodovinskih naročil, izvedite naslednje korake:

  1. Dodajte ciljno vozlišče S3 in ga poimenujte Orders table.
  2. Konfigurirajte format Parquet s hitrim stiskanjem in zagotovite ciljno pot S3, pod katero boste shranili rezultate (ločeno od povzetka).
  3. Izberite Ustvarite tabelo v podatkovnem katalogu in pri naslednjih zagonih posodobite shemo in dodajte nove particije.
  4. Vnesite ciljno bazo podatkov in ime za novo tabelo, na primer: option_orders.
    Konfiguracija namiznega pomivalnega korita

Zadnji del diagrama bi moral biti zdaj podoben naslednjemu, z dvema vejama za dva ločena izhoda.
DAG

Ko uspešno zaženete opravilo, lahko z orodjem, kot je Athena, pregledate podatke, ki jih je opravilo ustvarilo s poizvedovanjem po novi tabeli. Mizo najdete na seznamu Athena in izberite Predogled tabele ali samo zaženite poizvedbo SELECT (posodobitev imena tabele na ime in katalog, ki ste ju uporabili):

SELECT * FROM default.option_orders limit 10

Vsebina vaše tabele bi morala biti podobna naslednjemu posnetku zaslona.
Vsebina tabele

Čiščenje

Če tega primera ne želite obdržati, izbrišite dve opravili, ki ste jih ustvarili, dve tabeli v Atheni in poti S3, kjer so bile shranjene vhodne in izhodne datoteke.

zaključek

V tej objavi smo pokazali, kako vam lahko nove transformacije v AWS Glue Studio pomagajo narediti naprednejšo transformacijo z minimalno konfiguracijo. To pomeni, da lahko implementirate več primerov uporabe ETL, ne da bi morali pisati in vzdrževati kodo. Nove transformacije so že na voljo v AWS Glue Studio, tako da jih lahko že danes uporabite v svojih vizualnih opravilih.


O avtorju

Gonzalo Herreros je višji arhitekt za velike podatke v skupini AWS Glue.

Časovni žig:

Več od Veliki podatki AWS