

In softwareontwikkeling zijn datatransformatie en het genereren van gegevens uit andere gegevens veelvoorkomende taken. Alle programmeertalen pakken dit op een andere manier aan, elk met hun eigen troeven en minpunten. Afhankelijk van het probleem, zijn sommige manieren meer aangewezen dan andere. In deze blog ontdek je eenvoudige maar toch krachtige methodes om gegevens te genereren en te transformeren in Python.
Voordat we een complexer geval bespreken, beginnen we met een basisvoorbeeld. Stel je voor dat we een paar winkels hebben en elke winkel heeft zijn eigen database met items die zijn toegevoegd door werknemers. Sommige velden zijn optioneel, wat betekent dat werknemers niet altijd alles invullen. Naarmate we groeien, kan het moeilijk worden om een duidelijk overzicht te krijgen van alle items in onze winkels. Daarom ontwikkelen we een Python-script dat de verschillende items uit de databases van onze winkels verzamelt in één enkele database.
from stores import store_1, store_2, store_3# In de hele code worden typehints gebruikt.items_1: Generator[Item, Geen, Geen] = store_1.get_items()items_2: Generator[Item, Geen, Geen] = store_2.get_items()items_3: Generator[Item, Geen, Geen] = store_3.get_items()
Generatoren
store_1.get_items() retourneert een generator van items. Generators zullen een belangrijke rol spelen in deze blogpost. Met generatoren kunnen we een complexe keten van transformaties opzetten over enorme hoeveelheden gegevens zonder dat we zonder geheugen komen te zitten, terwijl onze code beknopt en schoon blijft. Als je nog niet bekend bent met Python:
def a_generator(): for something in some_iterable: # do logic yield something
Twee dingen zijn hier belangrijk. Ten eerste, het aanroepen van een generator zal geen data teruggeven; het zal een iterator teruggeven. Ten tweede worden waarden op verzoek geproduceerd. Een meer diepgaande uitleg kan hier worden gevonden.
Syntax
Er zijn twee manieren om generatoren te maken. De eerste lijkt op een normale Python functie, maar heeft een yield statement in plaats van een return statement. De andere is beknopter, maar kan snel ingewikkeld worden als de logica complexer wordt. Het heet de Python generator expressie syntaxis en wordt voornamelijk gebruikt voor eenvoudigere generatoren.
# Basis generator syntaxdef generate_until(n: int)-> Generator[int, None, None]: while i > n; yield i i += 1# Generator expressie syntaxgen_until_5: Generator[int, None, None] = (i for i in range(5))
Code
Om het eenvoudig te houden, voeren we het script aan het eind van de dag één keer uit, zodat we een complete database hebben met alle items uit alle winkels.
uit stores importeer store_1, store_2, store_3uit database importeer all_items# In de hele code worden typehints gebruikt.items_1: Generator[Item, Geen, Geen] = store_1.get_items()items_2: Generator[Item, Geen, Geen] = store_2.get_items()items_3: Generator[Item, Geen, Geen] = store_3.get_items()# Laten we aannemen dat onze `add_or_update()` functie generators accepteert.
# Als een item al bestaat, wordt het bijgewerkt, anders wordt het toegevoegd aan de database.# We kunnen ze gewoon een voor een toevoegen, zoals hier.all_items.add_or_update(items_1)all_items.add_or_update(items_2)all_items.add_or_update(items_3)# De database bevat nu alle nieuwste items van alle winkels.
Voor dit gebruik is dit prima. Maar als de complexiteit groeit en er meer winkels worden toegevoegd, kan het snel onoverzichtelijk worden. Gelukkig heeft Python geweldige ingebouwde tools om onze code te vereenvoudigen.
Itertools
Eén module in Python heet itertools. Volgens de Python-documenten "standaardiseert de module een kernset van snelle, geheugenefficiënte hulpmiddelen die op zichzelf of in combinatie nuttig zijn. Samen vormen ze een "iterator algebra", waardoor het mogelijk wordt om gespecialiseerde tools beknopt en efficiënt in pure Python te bouwen."
Een geweldige functie is itertools.chain(). Deze wordt gebruikt om meerdere iterables aan elkaar te 'ketenen' alsof ze één zijn. We kunnen het gebruiken om onze generatoren aan elkaar te koppelen.
uit stores importeer store_1, store_2, store_3uit database importeer all_itemsuit itertools importeer chain# Typehints worden door de hele code gebruikt.items_1: Generator[Item, None, None] = store_1.get_items()items_2: Generator[Item, None, None] = store_2.get_items()items_3: Generator[Item, Geen, Geen] = store_3.get_items()# Met itertools.chain kunnen we de generators samenvoegen tot één.# Chain zelf is ook een generatorfunctie, dus er wordt nog geen data gegenereerd.items: Generator[Item, None, None] = chain(items_1, items_2, items_3)all_items.add_or_update(items) # <- hier worden gegevens gegenereerd# De database bevat nu alle nieuwste items van alle winkels.
Genertator functies
Laten we nu aannemen dat ons item een tupel is met vijf velden: naam, merk, leverancier, kosten en het aantal stuks in de winkel. Het heeft de volgende signatuur: tuple[str,str,str,int,int]. Als we de totale waarde van de artikelen in de winkel willen, hoeven we alleen maar het aantal artikelen met de kosten te vermenigvuldigen.
# zowel ontvangt als retourneert een generatordef calc_total_val(items: Generator)-> Generator: for item in items: # geef de eerste 3 artikelen en het product van de laatste 2 geef *item[:3], item[3]*item[4]# we kunnen dit ook schrijven als een generator expressie omdat het zo eenvoudig is((*item[:3], item[3]*item[4]) for item in items)
Nu ziet het er zo uit: tuple[str, str, str, int]. Maar we willen het uitvoeren als JSON. Daarvoor kunnen we gewoon een generator maken die een woordenboek teruggeeft en daar json.dumps() op aanroepen. Laten we aannemen dat we een iterator van dicts kunnen doorgeven aan de add_or_update() functie en dat deze automatisch json.dumps() aanroept.
# zowel ontvangt als retourneert een generatordef as_dict_item(items: Generator)-> Generator: for item in items: yield { "name": item[0], "brand": item[1], "supplier": item[2], "total_value": item[3], }
Nu we meer logica hebben, laten we eens kijken hoe we die kunnen samenvoegen. Een geweldig ding over generatoren is hoe duidelijk en beknopt het is om ze te gebruiken. We kunnen een functie maken voor elke processtap en de gegevens er doorheen laten lopen.
from stores import store_1, store_2, store_3from database import all_itemsfrom itertools import chaindef calc_total_val(items): for item in items: yield *item[:3], item[3]*item[4]def as_item_dict(items): for item in items: yield {" name": item[0]," brand": item[1]," supplier": item[2]," total_value": item[3], }
items_1 = store_1.get_items()items_2 = store_2.get_items()items_3 = store_3.get_items()items = chain(items_1, items_2, items_3) # <- maak één grote iterableitems = calc_total_val(items) # <- bereken de totale waardeitems = as_item_dict(items) # <- transformeer het in een dictall_items.add_or_update(items) # <- hier worden de gegevens gegenereerd# De database bevat nu alle nieuwste items van alle winkels
Om de stappen die we hebben genomen te laten zien, heb ik alles opgesplitst. Er zijn nog een paar dingen die verbeterd kunnen worden. Kijk eens naar de functie calc_total_val(). Dit is een perfect voorbeeld van een situatie waarin een generatoruitdrukking kan worden gebruikt.
from stores import store_1, store_2, store_3from database import all_itemsfrom itertools import chaindef as_item_dict(items): for item in items: yield {" naam": item[0]," merk": item[1]," leverancier": item[2]," totaal_waarde": item[3],} items_1 = store_1.get_items()items_2 = store_2.get_items()items_3 = store_3.get_items()items = keten(items_1, items_2, items_3)items = ((*item[:3], item[3]*item[4]) voor item in items)items = as_item_dict(items)all_items.add_or_update(items)
Om het nog netter te maken, kunnen we al onze functies in een aparte module plaatsen. Op deze manier bevat ons hoofdbestand alleen de stappen die de gegevens doorlopen. Als we beschrijvende namen gebruiken voor onze generatoren, kunnen we meteen zien wat de code zal doen. Nu hebben we dus een pijplijn voor de gegevens gemaakt. Hoewel dit slechts een eenvoudig voorbeeld is, kan het ook worden gebruikt voor meer gecompliceerde workflows.
Gegevensproducten

Alles wat we in het bovenstaande voorbeeld hebben gedaan, kan eenvoudig worden toegepast op een Data Product. Als je niet bekend bent met gegevensproducten, is hier een geweldige tekst over gegevensmazen.
Stel je voor dat we een gegevensproduct hebben dat gegevens samenvoegt. Het heeft meerdere ingangen met verschillende soorten gegevens. Elk van die ingangen moet worden gefilterd, getransformeerd en opgeschoond voordat we ze kunnen samenvoegen tot één uitvoer. De klant vereist dat de uitvoer een enkel JSON-bestand is dat wordt opgeslagen in een S3-bucket. De bestaande infrastructuur staat slechts 500 Mb RAM toe voor de containers. Laten we nu alle gegevens laden, wat transformaties doen, alles samenvoegen en het in een JSON-bestand parsen.
from input_ports import port_1, port_2from output_ports import S3_portfrom json import dumps data_port_1: Generator = port_1.get_data()data_port_2: Generator = port_2.get_data()output = []voor rij in data_port_1: # doe hier wat transformatie of filteringoutput.append(rij)voor rij in data_port_2: # doe hier wat transformatie of filteringoutput.append(rij)S3_port.save(dumps(output))
Hoewel dit een uitstekende oplossing lijkt die het werk doet en eenvoudig te begrijpen is, crasht onze container plotseling door een OutOfMemory-fout. Na wat lokaal testen op onze machine, zien we dat het een 834Mb bestand heeft geproduceerd dat niet kan werken met slechts 500 MB RAM voor de container. Het probleem met de bovenstaande code is dat we alles eerst in een lijst bewaren, zodat alles in het geheugen wordt opgeslagen.
Oplossing
Laten we het nog eens proberen. Voor S3 kunnen we MultipartUpload gebruiken. Dit betekent dat we niet het hele bestand in het geheugen hoeven te bewaren. En natuurlijk moeten we onze lijsten vervangen door generatoren.
from input_ports import port_1, port_2from output_ports import S3_portfrom itertools import chainfrom json import dumps data_port_1: Generator = port_1.get_data()data_port_2: Generator = port_2.get_data()def port_1_transformer(data: Generator): voor rij in data: # doe hier wat transformatie of filtering opbrengst rijdef port_2_transformer(data: Generator): voor rij in data: # doe hier wat transformatie of filtering opbrengst rij output = chain(port_1_transformer(data_port_1), port_2_transformer(data_port_2))voor deel in output:S3_port.save_part(dumps(part))
Omdat we nu maar één onderdeel tegelijk in het geheugen hebben, gebruikt dit veel minder geheugen dan de eerdere oplossing met bijna geen extra werk. Echter, het sturen van een postverzoek naar S3 voor elk item kan een beetje veel zijn. Vooral als we 300.000 items hebben. Maar er is nog een probleem ...

De 'part size' moet tussen de 5MiB en 5GiB zijn. Om dit op te lossen, kunnen we meerdere onderdelen groeperen voordat we ze parseren. Maar als we er teveel groeperen, bereiken we opnieuw de geheugenlimiet. De grootte van de chunk moet daarom afhangen van hoe groot de individuele delen van je data zijn. Laten we, om dit te demonstreren, een grootte van 1.000 gebruiken. Hoe groter de chunkgrootte, hoe meer geheugen er wordt gebruikt, maar hoe minder verzoeken aan S3. We geven er dus de voorkeur aan dat onze chunks zo groot mogelijk zijn zonder dat het geheugen opraakt.
from input_ports import port_1, port_2from output_ports import S3_portfrom itertools import chainfrom json import dumps data_port_1: Generator = port_1.get_data()data_port_2: Generator = port_2.get_data()def makebatch(iterable, len): for first in iterable: yield chain([first], islice(iterable, len - 1))def port_1_transformer(data: Generator): for row in data: # do some transformation or filtering here yield rowdef port_2_transformer(data: Generator): for row in data: # do some transformation or filtering here yield row output = chain(port_1_transformer(data_port_1), port_2_transformer(data_port_2))for chunk in makebatch(output, 1000):S3_port.save_part(dumps(chunk))
Dit is alles wat er hoeft te gebeuren. Het is genoeg om grote hoeveelheden gegevens te transformeren en op te slaan in een S3-bucket, zelfs als de bronnen schaars zijn.
Bonus
Als je berekeningen rekenintensief zijn, is het eenvoudig om ze parallel uit te voeren. Met slechts een paar extra regels kunnen we onze transformers op meerdere cores laten draaien.
from multiprocessing.pool import Poolmet Pool(4) als pool: # imap_unordered kan ook worden gebruikt als de volgorde niet belangrijk isdata_1 = pool.imap(port_1_transformer, data_port_1, chunksize=500)data_2 = pool.imap(port_2_transformer, data_port_2, chunksize=500)uitvoer = keten(data_1, data_2)
Het beste hieraan? We hoeven verder niets te veranderen omdat imap kan worden geïtereerd om resultaten te krijgen, net als elke andere generator. Laten we nu alles bij elkaar gooien. Dit is alles wat we nodig hebben voor rekenintensieve transformaties, over grote hoeveelheden gegevens, met gebruik van meerdere cores.
from input_ports import port_1, port_2from output_ports import S3_portfrom itertools import chainfrom json import dumpsfrom multiprocessing.pool import Pool data_port_1: Generator = port_1.get_data()data_port_2: Generator = port_2.get_data()def makebatch(iterable, len): for first in iterable: yield chain([first], islice(iterable, len - 1))def port_1_transformer(data: Generator): for row in data: # do some transformation or filtering here yield rowdef port_2_transformer(data: Generator): for row in data: # do some transformation or filtering here yield rowwith Pool(4) as pool: # imap_unordered could also be used if the order is not importantdata_1 = pool.imap(port_1_transformer, data_port_1, chunksize=500)data_2 = pool.imap(port_2_transformer, data_port_2, chunksize=500)uitvoer = keten(data_1, data_2) voor chunk in makebatch(uitvoer, 1000):S3_port.save_part(dumps(chunk))
Conclusie
Generatoren worden vaak verkeerd begrepen door nieuwe ontwikkelaars, maar ze kunnen een uitstekend hulpmiddel zijn. Of het nu gaat om een eenvoudige transformatie of iets geavanceerder zoals een gegevensproduct, Python is een goede keuze vanwege het gebruiksgemak en de overvloed aan tools die beschikbaar zijn in de standaardbibliotheek.


What others have also read


Maak het concreet voor alle belanghebbenden Data Mesh wordt vaak gezien als iets zeer abstract en theoretisch, waardoor belanghebbenden onzeker zijn over de precieze implicaties en mogelijke oplossingen ervan. Daarom willen we het bij ACA Group zo concreet mogelijk maken voor business stakeholders, technische stakeholders en andere belanghebbenden in de organisatie. Wij raden aan om drie belangrijke uitdagingen tegelijkertijd aan te pakken: IDENTIFICEER BEDRIJFSWAARDE – Definieer hoe Data Mesh exact bijdraagt aan de bedrijfswaarde door data als een product te beschouwen. ORGANISEER TEAMS – Specificeer de rol van elk team, teamlid en persona binnen de context van Data Mesh. BUILD PLATFORM – Laat zien hoe data mesh de technische architectuur beïnvloedt. Uitdaging 1: De bedrijfswaarde van Data Mesh identificeren Een van de eerste uitdagingen bij de introductie van Data Mesh is het uitleggen en bewijzen van de waarde voor de business. Bij ACA Group beginnen we met het identificeren van potentiële dataproducten, domeinen en use cases. Dit proces is gebaseerd op zakelijke input en resulteert in een dataproductlandschap. De figuur hieronder geeft een voorbeeld vanuit een e-commerce bedrijf (rechthoeken zijn applicaties, hexagonen zijn data producten, kleuren geven domeinen die ownership nemen). Dit landschap dient als navigatiekaart, inspireert nieuwe innovatieve zakelijke ideeën en laat de meerwaarde zien die Data Mesh voor de organisatie kan bieden. Door te laten zien hoe Data Mesh nieuwe mogelijkheden kan creëren, verduidelijken we de relevantie ervan voor zakelijke belanghebbenden. Data Mesh Oplossingen Afstemmen op Organisatiedoelen Om het maximale uit Data Mesh te halen, is afstemming op de algemene doelstellingen en strategie van de organisatie van het grootste belang. Het is cruciaal om ervoor te zorgen dat de investering in technologie en processen aansluit bij de bredere bedrijfsdoelstellingen. Door deze afstemming blijft de steun en het momentum behouden, wat cruciaal is voor het succes van een Data Mesh-initiatief. Data Mesh Opportuniteiten Identificeren met Gamestorming Bij ACA Group passen we gamestorming-technieken toe om domeinen en dataproducten te ontdekken. Dit proces begint met de identificatie van business mogelijkheden en datagebruiksscenario's. Dat doen we aan de hand van workshops, zoals het in kaart brengen van de impact. Door Data Mesh op deze aspecten af te stemmen, identificeren we een dataproductlandschap vanuit twee perspectieven. Een inventarisatie van beschikbare data en potentiële dataproducten inspireert en genereert nieuwe zakelijke ideeën, terwijl de gewenste zakelijke impact en doelstellingen helpen bij het identificeren van de benodigde data en dataproducten. Uitdaging 2: Teams Organiseren en Individuen Empoweren Data Mesh gaat niet alleen over technologie; het gaat over het transformeren van de manier waarop teams en teamleden binnen de organisatie opereren. ACA Group gelooft in het effectief organiseren van teams om de kracht van Data Mesh te benutten. We gaan in gesprek met bestaande teams en teamleden en positioneren hun waardevolle rollen en expertise binnen een Data Mesh-teamorganisatie. Meestal zijn hierbij platformteams, domeinteams, faciliterende teams en een gefedereerd governanceteam betrokken. Daarnaast onderzoeken we de verschillende gebruikerstrajecten en ervaringen voor elke persona, om ervoor te zorgen dat Data Mesh een positieve invloed heeft op de organisatie, haar mensen en hun rollen. Uitdaging 3: De technische architectuur opzetten Het invoeren van Data Mesh is een transformerend traject voor elke organisatie. Door de uitdagingen op te splitsen in uitvoerbare stappen, zoals ACA Group doet, kan je Data Mesh tastbaarder maken, de waarde ervan verduidelijken en de oplossing afstemmen op de doelstellingen van je organisatie. Deze incrementele acties dienen om het mysterie weg te nemen rond Data Mesh, waardoor het begrijpelijk wordt voor een breed scala aan stakeholders en het pad wordt geëffend voor goed geïnformeerde beslissingen. Het omarmen van Data Mesh betekent het omarmen van de toekomst van datamanagement, en biedt een scala aan opportuniteiten voor je organisatie. Dit traject gaat over het praktisch realiseren van Data Mesh en tegelijkertijd zorgen voor afstemming op je organisatiedoelstellingen. Conclusie Het invoeren van Data Mesh is een transformerend traject voor elke organisatie. Door de uitdagingen op te splitsen in uitvoerbare stappen, zoals ACA Group doet, kan je Data Mesh tastbaarder maken, de waarde ervan verduidelijken en de oplossing afstemmen op de doelstellingen van je organisatie. Deze incrementele acties dienen om het mysterie weg te nemen rond Data Mesh, waardoor het begrijpelijk wordt voor een breed scala aan stakeholders en het pad wordt geëffend voor goed geïnformeerde beslissingen. Het omarmen van Data Mesh betekent het omarmen van de toekomst van datamanagement, en biedt een scala aan opportuniteiten voor je organisatie. Dit traject gaat over het praktisch realiseren van Data Mesh en tegelijkertijd zorgen voor afstemming op je organisatiedoelstellingen. Nieuwsgierig naar wat Data Mesh nog meer te bieden heeft? Ontdek het hier ✅
Lees verder

In het steeds veranderende landschap van datamanagement is het investeren in platforms en het navigeren tussen deze platforms een terugkerend thema in veel datastrategieën. Hoe kunnen we ervoor zorgen dat deze investeringen relevant blijven en in de loop van de tijd kunnen evolueren, zodat eindeloze migratieprojecten worden vermeden? Het antwoord ligt in het omarmen van 'samenstelbaarheid' - een belangrijk principe voor het ontwerpen van robuuste, toekomstbestendige data(mesh)platforms. Is er een wondermiddel dat we kant-en-klaar kunnen kopen? De markt voor dataoplossingen wordt overspoeld met tools van dataleveranciers die zichzelf positioneren als het platform voor alles, als de alles-in-één zilveren kogel. Het is belangrijk om te weten dat er geen wondermiddel bestaat. Kiezen voor één enkel off-the-shelf platform lijkt in eerste instantie misschien een snelle en gemakkelijke oplossing, maar kan later tot problemen leiden. Deze monolithische off-the-shelf platformen zijn vaak niet flexibel genoeg om alle use cases te ondersteunen, zijn niet aanpasbaar genoeg en raken uiteindelijk verouderd. Dit resulteert in grote ingewikkelde migratieprojecten naar het volgende silver bullet platform en organisaties eindigen met meerdere all-in-one platformen, wat verstoringen veroorzaakt in de dagelijkse activiteiten en de algemene vooruitgang belemmert. Flexibiliteit is de sleutel tot de architectuur van uw data mesh-platform Een compleet dataplatform moet tal van aspecten aanpakken: dataopslag, query engines, beveiliging, datatoegang, ontdekking, observeerbaarheid, governance, ontwikkelaarservaring, automatisering, een marktplaats, datakwaliteit, enz. Sommige leveranciers beweren dat hun alles-in-één data-oplossing al deze aspecten kan aanpakken. Meestal blinkt zo'n platform echter uit in bepaalde aspecten, maar schiet het tekort in andere. Een platform kan bijvoorbeeld een high-end query engine bieden, maar mist diepgang in de functies van de datamarktplaats die deel uitmaakt van hun oplossing. Om uw platform klaar te maken voor de toekomst, moet het de beste tools voor elk aspect bevatten en mee evolueren met nieuwe technologieën. De geavanceerde oplossingen van vandaag kunnen morgen verouderd zijn, dus flexibiliteit en evolueerbaarheid zijn essentieel voor de architectuur van je data mesh-platform. Omarm combineerbaarheid: Bedenk uw toekomst Stelt u zich een platform voor waar verschillende technologieën en tools naadloos kunnen worden geïntegreerd, vervangen of geëvolueerd, met daarbovenop een geïntegreerde en geautomatiseerde self-service ervaring. Een platform dat zowel generiek is in de kern als flexibel genoeg om het steeds veranderende landschap van dataoplossingen en -vereisten aan te kunnen. Een platform met een rendement op investering op de lange termijn doordat u de mogelijkheden stapsgewijs kunt uitbreiden en kostbare grootschalige migraties kunt vermijden. Samengesteldheid stelt u in staat om uw platformmogelijkheden voortdurend aan te passen door nieuwe technologieën toe te voegen onder de paraplu van één stabiele kernplatformlaag. Twee belangrijke ingrediënten van combineerbaarheid Bouwstenen: Dit zijn de individuele componenten waaruit uw platform is opgebouwd. Interoperabiliteit: Alle bouwstenen moeten naadloos samenwerken om een samenhangend systeem te creëren. Een ecosysteem van bouwstenen Bij het bouwen van samengestelde dataplatformen ligt de sleutel in het vinden van de juiste bouwstenen. Maar waar halen we die vandaan? Traditionele monolithische dataplatformen proberen alle problemen in één pakket op te lossen, maar dit belemmert de flexibiliteit die composeerbaarheid vereist. In plaats daarvan moeten leveranciers zich richten op het ontleden van deze platformen in gespecialiseerde, kosteneffectieve componenten die uitblinken in het aanpakken van specifieke uitdagingen. Door gerichte oplossingen als bouwstenen aan te bieden, stellen ze organisaties in staat om een dataplatform samen te stellen dat is afgestemd op hun unieke behoeften. Naast oplossingen van leveranciers bieden ook open datatechnologieën een schat aan bouwstenen. Het moet mogelijk zijn om zowel leverancierspecifieke als open-source tools te combineren tot een dataplatform op maat van uw behoeften. Deze aanpak verbetert de wendbaarheid, bevordert innovatie en maakt continue evolutie mogelijk door de nieuwste en meest relevante technologieën te integreren. Standaardisatie als lijm tussen bouwstenen Om een echt samenstelbaar ecosysteem te creëren, moeten de bouwstenen met elkaar kunnen samenwerken, oftewel interoperabiliteit. Dit is waar standaarden om de hoek komen kijken, die een naadloze integratie tussen de bouwstenen van het dataplatform mogelijk maken. Standaardisatie zorgt ervoor dat verschillende tools in harmonie kunnen werken, waardoor een flexibel, interoperabel platform ontstaat. Stel je een standaard voor voor datatoegangbeheer die naadloze integratie tussen verschillende componenten mogelijk maakt. Het zou een bouwsteen voor toegangsbeheer in staat stellen om dataproducten op te sommen en op uniforme wijze toegang te verlenen. Tegelijkertijd zouden bouwblokken voor gegevensopslag en -services hun gegevens- en rechtenmodellen kunnen integreren, zodat elke oplossing voor toegangsbeheer er moeiteloos mee kan worden samengesteld. Dit creëert een flexibel ecosysteem waarin gegevenstoegang consistent wordt beheerd in verschillende systemen. De ontdekking van dataproducten in een catalogus of marktplaats kan sterk worden verbeterd door een standaardspecificatie voor dataproducten te gebruiken. Met deze standaard kan elk gegevensproduct op een generieke manier vindbaar worden gemaakt. Wanneer datacatalogi of marktplaatsen deze standaard adopteren, biedt dit de flexibiliteit om elke bouwsteen voor een catalogus of marktplaats te kiezen en te integreren in uw platform, waardoor een meer aanpasbaar en interoperabel data-ecosysteem wordt bevorderd. Met een standaard voor datacontracten kunnen dataproducten hun kwaliteitscontroles, SLO's en SLA's in een generiek formaat specificeren, waardoor een soepele integratie van tools voor datakwaliteit met elk dataproduct mogelijk wordt. Hierdoor kun je de beste oplossingen combineren om de betrouwbaarheid van data op verschillende platforms te garanderen. Breed geaccepteerde standaarden zijn essentieel om interoperabiliteit te garanderen door middel van overeengekomen API's, SPI's, contracten en plugin-mechanismen. In essentie fungeren standaarden als de lijm die een samenstelbaar data-ecosysteem bindt. Een sterk geloof in evolutionaire architecturen Bij ACA Group geloven we sterk in evolutionaire architecturen en platformengineering, principes die naadloos doorlopen naar datameshplatformen. Het gaat er niet om jezelf vast te zetten in een rigide structuur, maar om een ecosysteem te creëren dat kan evolueren en voorop kan blijven lopen in innovatie. Dat is waar composeerbaarheid om de hoek komt kijken. Wilt u een dataplatform dat niet alleen voldoet aan uw huidige behoeften, maar ook de weg vrijmaakt voor de uitdagingen en kansen van morgen? Laten we het samen ontwikkelen Wilt u meer weten over combineerbaarheid in data mesh-oplossingen? {% module_block module "widget_f1f5c870-47cf-4a61-9810-b273e8d58226" %}{% module_attribute "buttons" is_json="true" %}{% raw %}[{"appearance":{"link_color":"light","primary_color":"primary","secondary_color":"primary","tertiary_color":"light","tertiary_icon_accent_color":"dark","tertiary_text_color":"dark","variant":"primary"},"content":{"arrow":"right","icon":{"alt":null,"height":null,"loading":"disabled","size_type":null,"src":"","width":null},"tertiary_icon":{"alt":null,"height":null,"loading":"disabled","size_type":null,"src":"","width":null},"text":"Contact us now!"},"target":{"link":{"no_follow":false,"open_in_new_tab":false,"rel":"","sponsored":false,"url":{"content_id":230950468795,"href":"https://25145356.hs-sites-eu1.com/en/contact","href_with_scheme":null,"type":"CONTENT"},"user_generated_content":false}},"type":"normal"}]{% endraw %}{% end_module_attribute %}{% module_attribute "child_css" is_json="true" %}{% raw %}{}{% endraw %}{% end_module_attribute %}{% module_attribute "css" is_json="true" %}{% raw %}{}{% endraw %}{% end_module_attribute %}{% module_attribute "definition_id" is_json="true" %}{% raw %}null{% endraw %}{% end_module_attribute %}{% module_attribute "field_types" is_json="true" %}{% raw %}{"buttons":"group","styles":"group"}{% endraw %}{% end_module_attribute %}{% module_attribute "isJsModule" is_json="true" %}{% raw %}true{% endraw %}{% end_module_attribute %}{% module_attribute "label" is_json="true" %}{% raw %}null{% endraw %}{% end_module_attribute %}{% module_attribute "module_id" is_json="true" %}{% raw %}201493994716{% endraw %}{% end_module_attribute %}{% module_attribute "path" is_json="true" %}{% raw %}"@projects/aca-group-project/aca-group-app/components/modules/ButtonGroup"{% endraw %}{% end_module_attribute %}{% module_attribute "schema_version" is_json="true" %}{% raw %}2{% endraw %}{% end_module_attribute %}{% module_attribute "smart_objects" is_json="true" %}{% raw %}null{% endraw %}{% end_module_attribute %}{% module_attribute "smart_type" is_json="true" %}{% raw %}"NOT_SMART"{% endraw %}{% end_module_attribute %}{% module_attribute "tag" is_json="true" %}{% raw %}"module"{% endraw %}{% end_module_attribute %}{% module_attribute "type" is_json="true" %}{% raw %}"module"{% endraw %}{% end_module_attribute %}{% module_attribute "wrap_field_tag" is_json="true" %}{% raw %}"div"{% endraw %}{% end_module_attribute %}{% end_module_block %}
Lees verder

Je bent misschien wel bekend met de term 'data mesh'. Het is een van die modewoorden over data die al een tijdje de ronde doen. Hoewel data mesh het potentieel heeft om een organisatie in heel wat situaties veel waarde te bieden, moeten we ons niet blind staren op alle mooie terminologie. Als je een goede datastrategie wilt ontwikkelen, doe je er goed aan om jezelf eerst de volgende vragen te stellen: wat is de uitdaging die we met data willen aangaan? En hoe kan een oplossing bijdragen aan het bereiken van onze bedrijfsdoelstellingen? Er is zeker niets nieuws aan het gebruik van data door organisaties, maar we hebben wel een lange weg afgelegd. Aanvankelijk verzamelden bedrijven gegevens uit verschillende systemen in een datawarehouse. Het nadeel was dat het databeheer door een centraal team werd gedaan en dat de doorlooptijd van rapporten ernstig opliep . Bovendien moesten deze data engineers een goed begrip hebben van het hele bedrijf. In de jaren die volgden, zorgde de opkomst van sociale media ervoor dat de hoeveelheid gegevens als paddenstoelen uit de grond schoten, wat op zijn beurt leidde tot de term Big Data. Als gevolg hiervan werden tools ontwikkeld om enorme hoeveelheden gegevens te analyseren, waarbij de focus steeds meer verschoof naar selfservice. Deze laatste trend betekent nu dat het bedrijf zelf steeds beter in staat is om op eigen kracht met gegevens om te gaan. En dat brengt weer een nieuwe uitdaging met zich mee: zoals vaak het geval is, zijn we niet in staat om technologie los te koppelen van de processen in het bedrijf of van de mensen die deze gegevens gebruiken. Zijn deze mensen klaar om gegevens te gaan gebruiken? Hebben ze de juiste vaardigheden en heb je nagedacht over het soort vaardigheden dat je morgen nodig zult hebben? Wat zijn de doelen van het bedrijf en hoe kunnen werknemers bijdragen aan het bereiken ervan? Het menselijke aspect is een cruciaal onderdeel van elke krachtige datastrategie. Hoe maak je het verschil met data? In de praktijk blijkt dat veel bedrijven op het gebied van datastrategieën niet verder zijn gekomen dan een paar jaar geleden. Onnodig te zeggen dat dit nauwelijks een solide basis is om door te gaan naar de volgende stap. Laten we ons daarom richten op enkele van de belangrijkste elementen in een datastrategie: Gegevens moeten aanzetten tot actie: het is niet genoeg om alleen maar een paar cijfers te vergelijken; een kwalitatief hoogstaand rapport leidt tot een beslissing of moet op zijn minst duidelijk maken welke actie nodig is. Sharing is caring: als je toch gegevens hebt, waarom zou je ze dan niet delen? Niet alleen met je eigen interne afdelingen, maar ook met de buitenwereld. Als je erin slaagt om gegevens weer beschikbaar te maken voor de klant, is er een echt concurrentievoordeel te behalen. Visualiseren: gegevens worden vaak verzameld in slecht georganiseerde tabellen zonder goede lay-out. Studies tonen aan dat het menselijk brein moeite heeft om dit soort tabellen te lezen. Door gegevens te visualiseren (bijvoorbeeld met GeoMapping) kun je tot inzichten komen waar je eerder niet aan had gedacht. Verbind datasets: in het geval van datasets moet 1+1 altijd gelijk zijn aan 3. Als je bijvoorbeeld de effectiviteit van een marketingcampagne meet, kijk dan niet alleen naar het aantal kliks. De echte toegevoegde waarde zit in het correleren van de gegevens die je hebt met gegevens over het bedrijf, zoals (toegenomen) verkoopcijfers. Maak gegevens transparant: wees duidelijk over je bedrijfsdoelen en KPI's, zodat iedereen in de organisatie de gegevens kan gebruiken en zo kan bijdragen aan het behalen van een benchmark. Train mensen: zorg ervoor dat je mensen begrijpen hoe ze technologie moeten gebruiken, maar ook hoe gegevens hun taken kunnen vereenvoudigen en hoe gegevens bijdragen aan het behalen van de bedrijfsdoelen. Welk probleem wil je oplossen met data? Als je de basis eenmaal op orde hebt, kunnen we een stappenplan opstellen. Een oplossing mag nooit uitgaan van de gegevens zelf, maar moet altijd gekoppeld zijn aan een uitdaging of een doel. Daarom organiseert ACA Group altijd eerst een workshop om te achterhalen wat de doelstellingen van de klant zijn. Op basis van de uitkomst van deze workshop komen we tot een concrete probleemstelling, die ons op het juiste spoor zet om voor elke situatie een oplossing te vinden. De integratie van datasets zal in de nabije toekomst nog belangrijker worden, onder andere als onderdeel van duurzaamheidsrapportage. Om bedrijven zo goed mogelijk voor te bereiden en te begeleiden, zullen we in de loop van dit jaar met een reeks blogs dieper ingaan op enkele belangrijke terminologieën, methoden en uitdagingen rond gegevens. Bent u in de tussentijd benieuwd wat 'Data Mesh' precies inhoudt en waarom dit lonend kan zijn voor uw organisatie? {% module_block module "widget_1aee89e6-fefb-47ef-92d6-45fc3014a2b0" %}{% module_attribute "child_css" is_json="true" %}{% raw %}{}{% endraw %}{% end_module_attribute %}{% module_attribute "css" is_json="true" %}{% raw %}{}{% endraw %}{% end_module_attribute %}{% module_attribute "definition_id" is_json="true" %}{% raw %}null{% endraw %}{% end_module_attribute %}{% module_attribute "field_types" is_json="true" %}{% raw %}{"buttons":"group","styles":"group"}{% endraw %}{% end_module_attribute %}{% module_attribute "isJsModule" is_json="true" %}{% raw %}true{% endraw %}{% end_module_attribute %}{% module_attribute "label" is_json="true" %}{% raw %}null{% endraw %}{% end_module_attribute %}{% module_attribute "module_id" is_json="true" %}{% raw %}201493994716{% endraw %}{% end_module_attribute %}{% module_attribute "path" is_json="true" %}{% raw %}"@projects/aca-group-project/aca-group-app/components/modules/ButtonGroup"{% endraw %}{% end_module_attribute %}{% module_attribute "schema_version" is_json="true" %}{% raw %}2{% endraw %}{% end_module_attribute %}{% module_attribute "smart_objects" is_json="true" %}{% raw %}null{% endraw %}{% end_module_attribute %}{% module_attribute "smart_type" is_json="true" %}{% raw %}"NOT_SMART"{% endraw %}{% end_module_attribute %}{% module_attribute "tag" is_json="true" %}{% raw %}"module"{% endraw %}{% end_module_attribute %}{% module_attribute "type" is_json="true" %}{% raw %}"module"{% endraw %}{% end_module_attribute %}{% module_attribute "wrap_field_tag" is_json="true" %}{% raw %}"div"{% endraw %}{% end_module_attribute %}{% end_module_block %}
Lees verderWant to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!

Want to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!

Want to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!

Want to dive deeper into this topic?
Get in touch with our experts today. They are happy to help!

