Poslední meet-up o Azure DataBricks se nám trochu zvrtnul v příjemný pokec na různá témata související s Databricks. Což bylo super! Stihli jsme pizzu, pivo i panáka. Nestihli jsme s Magdou ale zdaleka odprezentovat vše, co jsme chtěli. Tak proč aspoň něco z toho nehodit do blogu?
Prakticky jsme ukázali, že vytvořit si od nuly Databricks workspace a načíst do něj data je relativně brnkačka, trvá to chvíli, ke všemu je GUI a není to žádná věda. Ukazovali jsme si připojení storage accountů a data lake storage gen2, práci s notebooky, načtení dat, připojení na Power BI, atd.
Už jsme, ale nestihli ukázat (mimo jiné), jak pohodlně a jednoduše lze data čistit, transformovat a využít pro ML. Pojďme se dnes v rychlosti podívat alespoň na data cleansing.
Co běžně potřebujeme je odstranit nebo doplnit chybějící údaje, zbavit se duplicit, odstranit data, která jsou vyloženě špatně, příp. i aplikovat nějakou business logiku pro vyčištění dat.
Řekněme, že mám už načtený data frame customerCategoriesDF. Data sdílet nebudu, vy zkoušejte na svých datech, to je vždycky nejlepší 😊. Všechny příklady používají Scala.
Pojďme na to
Chci odstranit všechny řádky, které nemají CustomerCategoryID:
customerCategoriesDF
.na.drop(Seq(„CustomerCategoryID“))
Pokud chci nevyplněné hodnoty vyplnit nějakou výchozí hodnotou, stačí si nadefinovat mapování a použít ho:
var defaultValueMap = Map(
„CustomerCategoryName“ -> „Unknown Category“
)
customerCategoriesDF
.na.fill(defaultValueMap)
Často je potřeba se zbavit duplicitních záznamů. Pokud jde o odstranění řádků, které jsou kompletně úplně stejné, stačí toto:
customerCategoriesDF.dropDuplicates()
To je vše. No není to krása? Často je ale potřeba brát v potaz jen konkrétní sloupec nebo sloupce. Takže pokud chci mít vždy jen jeden řádek s názvem kategorie a ostatní chci zahodit, stačí toto:
customerCategoriesDF.dropDuplicates(„CustomerCategoryName“)
Příklad pro business rule – řekněme, že chci jen kategorie, které obsahují min. dvě slova (tedy alespoň jednu mezeru):
customerCategoriesDF.filter($“CustomerCategoryName“ like „% %“)
Všechny tyto operace lze „zřetězit“:
customerCategoriesCleansedDF = customerCategoriesDF
.na.fill(defaultValueMap) // use default values based on map created in previous step
.na.drop(Seq(„CustomerCategoryID“)) // drop if values these columns are empty
.filter($“CustomerCategoryName“ like „% %“)
.dropDuplicates(„CustomerCategoryName“)
display(customerCategoriesCleansedDF)
A teď si představte, za kolika „čtverečky“ by byla logika v předchozím příkladu schovaná v SSIS nebo v ADF. Místo změti nesrozumitelného XML (SSIS) nebo JSONu (ADF) je toto krátký, přehledný, jednoduchý, srozumitelný a krásně verzovatlený kód.
No a víc se do blog postu nevejde. Takže už se můžete těšit na příští s názvem „Co se do blog postu nevešlo“.
I work for Joyful Craftsmen as a Data Engineer. I like Microsoft technologies (SQL Server, .NET), Azure and lot of other. I also like automating things (and DevOps generally).