Er zit een big data-project in de pijplijn en je vraagt je af welke taal het meest geschikt is voor de taak die je op het oog hebt. Die vraag kun je bij het plannen van een dataproject niet lang voor je uitschuiven. Er zijn drie grote namen die mensen momenteel gebruiken voor big data: R, Python en Scala. Daarnaast blijft Java immer populair in zakelijke omgevingen. We leggen ze naast elkaar om te bekijken welke taal voor welke doeleinden het meest geschikt is.

R

R wordt vaak beschreven als de taal die voor en door statistici is gebouwd. Zoek je een esoterisch statistisch model voor je berekening? Dat vind je waarschijnlijk wel op het Comprehensive R Archive Network (CRAN). Voor analyse en plotten zit je goed met ggplot2. En als je meer resources nodig hebt dan wat je machine kan leveren, dan kun je SparkR-bindings gebruiken om Spark met R te draaien.

Maar als je een datawetenschapper bent die niet met Matlab, SAS of OCTAVE heeft gewerkt, kan het even duren om je draai te vinden en productief te worden met R. Het is heel geschikt voor data-analyse, maar minder geschikt voor algemenere doelen. Je zou dan een model kunnen opzetten in R, maar voor de productie vertalen naar Scala of Python en je zou dan geen goed systeem hebben om clustering te beheren.

Python

Als de datawetenschappers in jouw organisatie niet met R werken, kennen ze waarschijnlijk Python van binnen en van buiten. In academische kringen is het al meer dan een decennium een populaire taal, vooral op het gebied van taalverwerking (NLP). Als je NLP-werk moet verrichten, zit je niet om keuzes verlegen. Je kunt de klassieke toolkit NTLK gebruiken, onderwerpen modelleren met GenSim of het supersnelle en nauwkeurige spaCy inzetten.

Ook Python kan meer dan je op het eerste gezicht zou zeggen, bijvoorbeeld werken met neurale netwerken via Theano en Tensorflow, machine learning met scikit-learn of data-analyse met NumPy en Pandas.

Je hebt verder Juypter/iPython, het Notebook-platform waarmee je code, plots en wat je nog meer hebt kunt combineren in een deelbaar logbook-formaat. Dat was altijd een van Pythons opvallendste features en het concept bleek zo nuttig dat je het tegenkomt in alle talen die iets als Read-Evaluate-Print-Loop (REPL) gebruiken, inclusief Scala en R.

Python wordt meestal ondersteund in de meeste frameworks die met big data omgaan, maar tegelijkertijd wordt het niet als eersteklas taal gezien. Zo verschijnen nieuwe Spark-features direct in de belangrijkste Scala/Java-bindings, maar het duurt een paar updates voordat dezelfde features beschikbaar zijn in PySpark (wat vooral geldt voor Spark Streaming/MLLib).

In tegenstelling tot R is Python een traditionele objectgeoriënteerde taal, dus de meeste ontwikkelaars zullen het zich snel eigen maken, terwijl de eerste stappen met R of Scala intimiderend kunnen zijn voor een beginner. Een twistpunt in Python is het correct gebruik van spaties/tabs. Aan de ene kant vind je mensen die dit leesbaarder vinden en aan de andere kant mensen die vinden dat we anno 2016 niet meer zouden hoeven te ruziën met een interpreter, omdat in een regel één teken verkeerd staat. (Je ziet vast wel aan welke kant ik sta in dit debat.)

Scala

Van de vier talen die we hier bespreken, wordt Scala vrijwel unaniem aanbeden om zijn typering. Het is een succesvol huwelijk van functioneel en objectgeoriënteerd programmeren. Scala maakt vooral furore in de financiële wereld en bij bedrijven die grote hoeveelheden data zeer gedistribueerd moeten verwerken, zoals Twitter en LinkedIn. Het is ook de taal die Spark en Kafka aandrijft.

Omdat het in de JVM draait, haakt het direct in op het Java-ecosysteem. Scala heeft ook een breed scala aan native library's voor het verwerken van data op schaal (neem bijvoorbeeld Twitters Algebird en Summingbird). Het bevat verder een handige REPL voor interactieve ontwikkeling en analyse, zoals in Python en R.

Persoonlijk draag ik Scala een warm hart toe, onder meer omdat het nuttige features bevat als patroonvergelijking en het is veel bondiger dan standaard-Java. Er zijn verschillende manieren om hetzelfde te doen in Scala en dat is in principe een pluspunt. Maar omdat het een Turingvolledig typeringssysteem is met allerlei sierlijke operators (':/' voor foldLeft en ':\' voor foldRight) kun je een Scala-bestand openen en het aanzien voor een complex stukje Perl. Daarom hebben we goede richtlijnen en best practices nodig voor Scala. (De stijlgids van Databricks is een redelijk begin.)

Een ander nadeel is dat de compiler aan de trage kant is. Het is zo erg dat het deze klassieke XKCD-strip oproept. Maar het heeft REPL, big data-ondersteuning, Notebooks a la Jupyter en Zeppelin, dus ik vergeef Scala veel van zij excentrieke dingen.

Java

Ten slotte is er altijd nog Java - ongeliefd, in de steek gelaten, niet modieus en in bezit van een bedrijf dat er vooral geld mee lijkt te willen verdienen door Google voor de rechter te slepen. Alleen suffe zakelijke werkers gebruiken Java! Toch is het prima geschikt voor een big data-project. Vergelijk het met Hadoop MapReduce. HFDS is geschreven in Java. Zelfs Storm, Kafka en Spark draaien op de JVM (in Clojure en Scala). Verder zijn er nieuwe technologieën als Google Cloud Dataflow (nu Apache Beam) die tot voor kort enkel Java ondersteunden.

Java is niet de keus voor de ninja/rockstar/ander cliché-programmeur. Maar terwijl zij bezig zijn om hun geneste callbacks in hun Node.js-applicaties te ontwarren, ontsluit Java een groot eceosysteem van profilers, debug- en monitoring-tools, library's voor zakelijke beveiliging en interoperabiliteit, en veel meer dingen die beproefd zijn gedurende de meer dan twee decennia dat het bestaat. (Het spijt me dat ik dit slechte nieuws moet brengen, maar Java wordt 21 dit jaar en we zijn allemaal oud.)

De grootste punten tegen Java is de langdradigheid van de taal en het gebrek aan een REPL (wel in R, Python en Scala) voor iteratieve ontwikkeling. Ik heb 10 regels Scala wel eens zien omgevormd worden tot een Java-monster van 200 regels met grote typeringsstatements die het grootste deel van het scherm opslokken.

De ondersteuning van lambda in Java 8 lost veel van deze issues op. Java zal nooit zo compact worden als Scala, maar Java 8 maakt ontwikkelen in de taal een stuk soepeler. REPL ontbreekt voorlopig, maar in Java 9 (dat volgend jaar moet verschijnen) zal JShell zijn opgenomen om te voorzien in deze behoefte.

Conclusie

Dus welke taal moet je gebruiken voor het verwerken van big data? Ik ben bang dat ik voor het laffe cliché "dat hangt er vanaf" moet gaan.

Als je zware data-analyse moet doen met obscure statistische berekeningen, moet je wel gek zijn als je de voorkeur niet naar R laat uitgaan. Als je NLP-projecten hebt of met meerdere GPU's neurale netwerk-berekeningen wilt uitvoeren, is Python waarschijnlijk de beste keus. En voor een stevige, stroomlijnende oplossing voor de operationele tooling, zijn Java en Scala absoluut goede keuzes.

Het hoeft overigens geen of-of-situatie te zijn. Je kunt bijvoorbeeld in Spark je ontworpen functioneel model met R of Python gebruiken om data in rust te hanteren. Vervolgens laat je deze pipeline naar opslag verwijzen, zodat je hem kunt gebruiken met je Scala Spark Streaming-applicatie in productie. Je moet het niet overdrijven (anders loop je snel tegen uitputting aan), maar het gebruik van verschillende talen en hun sterke punten benutten kan zeer nuttig zijn bij een big data-project.