Notebooks en SQL¶
Dit hoofdstuk laat zien hoe je met de data werkt: in een Python- en Spark-notebook in JupyterHub, en met SQL. De voorbeelden volgen het dataproduct uit Data engineer-traject: de catalogus finance en de tabel finance.facturen.regels.
Inloggen bij JupyterHub¶
Open
https://<customer>.dataprocessing.datafoundation.euen kies Sign in with OAuth 2.0.
Log in met je platformaccount (zie Inleiding). JupyterHub start je eigen notebookserver. De eerste keer duurt dat een paar minuten: de pagina zegt Your server is starting up en opent zelf JupyterLab zodra het klaar is.
JupyterLab opent met links de bestandsbrowser en rechts de launcher. Kies Python 3 (ipykernel) onder Notebook om een nieuw notebook te starten.
Notitie
Je notebookserver stopt vanzelf na een uur zonder activiteit. Je notebooks blijven in je eigen thuismap staan en zijn er weer als de server opnieuw start. Het aantal servers dat tegelijk draait is beperkt: zegt JupyterHub dat het vol zit, probeer het dan over een paar minuten opnieuw. Om je server zelf te stoppen kies je File > Hub Control Panel > Stop My Server.
Je Spark-sessie¶
In elk notebook staat een Spark-sessie met de naam spark klaar; die start de eerste keer dat je hem gebruikt. De sessie kent de catalogi die je mag gebruiken al, dus je verwijst naar data met de naam in drie delen catalogus.schema.tabel. Zonder catalogus gebruikt Spark main.
Notitie
Je notebook heeft geen directe toegang tot de bestanden van de datalake. Spark leest en schrijft ze via het platform, dat voor elk bestand nagaat of jouw team het mag gebruiken. Je hoeft de lake nooit zelf te openen.
Een schema en een tabel aanmaken¶
Als je een catalogus bezit, of de rol writer erop hebt, kun je er met Spark schema’s en tabellen in maken. Maak eerst het schema en dan de tabel. Schrijf tabellen altijd in het formaat Delta:
spark.sql("CREATE SCHEMA IF NOT EXISTS finance.facturen")
rijen = [
(1, "Gemeente Noordwijk", "noord", 1250.00, "inkoop.noord@demo.invalid"),
(2, "Waterschap De Delta", "zuid", 980.50, "inkoop.zuid@demo.invalid"),
]
df = spark.createDataFrame(rijen, ["factuur_id", "klant", "regio", "bedrag", "email"])
df.write.format("delta").saveAsTable("finance.facturen.regels")
spark.table("finance.facturen.regels").show()
Voer een cel uit met Shift+Enter, of het hele notebook met Run > Run All Cells.
De tabel staat nu in de catalogusboom van Security Center, met jouw team als eigenaar (ververs de pagina als je hem nog niet ziet). Voor inladen met het metadata-gedreven framework schrijven Platform().write_to_table en upsert_table naar dezelfde tabellen, zie Scamander MDIF.
Waarschuwing
Zonder .format("delta") probeert Spark een Parquet-tabel te maken en weigert het platform dat met de melding “Unity Catalog does not support non-Delta managed table”. Zie Problemen oplossen en veelgestelde vragen.
Notitie
Een catalogus of schema dat iemand aanmaakt terwijl je notebook draait, is nog niet bekend in je sessie. Herstart de kernel (Kernel > Restart Kernel) om het te zien.
Data lezen waarvoor je gefilterde toegang hebt¶
Een tabel waarvoor je team alleen een gefilterde rol heeft, lees je precies zoals elke andere tabel. Het platform past het rijfilter en het kolommasker voor je toe. In dit voorbeeld heeft het team Marketing de rol regio_noord: alleen de rijen van de regio noord, met de kolom email gemaskeerd.
spark.table("finance.facturen.regels").show(truncate=False)
spark.sql("""
SELECT regio, count(*) AS facturen, round(sum(bedrag), 2) AS totaal
FROM finance.facturen.regels
GROUP BY regio
""").show()
Totalen en aantallen tellen alleen de rijen die je mag zien. Naar een tabel waarvoor je een gefilterde rol hebt, kun je niet schrijven.
SQL met Trino en BI-tools¶
BI-tools en andere SQL-clients verbinden met het Trino-adres van je organisatie met je platformaccount. Ze zien dezelfde catalogi en dezelfde toegangsregels als jij. In een notebook is Trino ook beschikbaar als Spark-catalogi met alleen-lezen toegang waarvan de naam met trino begint.
De verbindingsgegevens staan in Security Center: kies de tegel Trino op het dashboard. Het venster Verbinden met Trino toont de host, de poort, de standaardcatalogus, een JDBC-URL en een Python-voorbeeld, elk met een kopieerknop.
Om te bevragen vanuit een SQL-client op je eigen computer gebruik je een client met een Trino-driver, bijvoorbeeld DBeaver:
Installeer DBeaver Community.
Kies Database > New Database Connection en kies Trino.
Kies URL en plak de JDBC-URL uit het venster Verbinden met Trino. Vul je platformgebruikersnaam in en laat het wachtwoord leeg. DBeaver downloadt de eerste keer de driver.
Kies Test Connection of Finish. Er opent een browser: meld je aan met je platformaccount. Daarna verschijnen de catalogi in de navigator, met dezelfde toegang als in Security Center.
De Trino CLI werkt op dezelfde manier: trino --server https://<customer>.trino.datafoundation.eu --external-authentication.
SQL Server Management Studio (SSMS) en Azure Data Studio kunnen niet verbinden: die praten alleen met Microsoft SQL Server, en Trino is geen SQL Server. Een ODBC-driver voor Trino installeren verandert dat niet: SSMS kan geen andere drivers gebruiken. De webpagina van Trino (https://<customer>.trino.datafoundation.eu) toont de queries die draaien, niet de catalogi en tabellen; gebruik een SQL-client om die te bekijken. Vraag voor Power BI je beheerder.
Geplande notebooks met Airflow¶
Om een notebook volgens een planning te laten draaien gebruik je Apache Airflow met de SparkNotebookOperator, zie Airflow. Een geplande notebook draait als een eigen service-identiteit, die toegang tot de data nodig heeft zoals elk team. Airflow is een optioneel product; vraag je beheerder naar het adres en of het voor jouw organisatie draait.
Open Airflow en kies Sign In with keycloak. Je logt in met hetzelfde platformaccount als overal.
Dags toont de workflows die Airflow kent. Een nieuwe Dag begint gepauzeerd: zet hem aan met de schakelaar aan het begin van de rij. De lijst toont standaard de Active Dags; kies All om ook de gepauzeerde te zien. Een rood getal naast het aantal Dags betekent dat sommige bestanden niet konden worden geladen; open het om te lezen waarom.