Parquedit
Parquedit lanseres september 2026 og er ikke klar for bruk.
Parquedit er en tjeneste som gir statistikere database-funksjonalitet over Parquet-filer. Formålet med tjenesten er å dekke lagringsbehovene knyttet til arbeid med manuell editering av data i SSB. Les mer om Prinsipper og retningslinjer for dataeditering i SSB.
Parquedit inkluderer IKKE et grafisk grensesnitt (GUI) for å gjøre manuelle endringer på data, kun en enkel Python-funksjon som oppdaterer informasjon i en rad i et datasett. Parquedit kan derimot benyttes som en underliggende lagringsløsning som oppdateres via GUI’er som Editeringsrammeverket eller andre løsninger.
ssb-parquedit er bygget på Ducklake og har følgende egenskaper:
- versjonering av data
- tidsreiser
- flere samtidige brukere (concurrency)
- ACID-transaksjoner
- logging av endringer
- hva ble endret?
- hvem endret?
- hvorfor ble det endret?
Tjenesten lagrer data i statistikkteamets produktbøtte, mens metadata lagres i en sentral katalog på Dapla. Teamene kan benytte seg av Python-pakken ssb-parquedit for å jobbe med Parquedit-tabellen sine fra Dapla Lab.
- Installer pakken i prosjektet ditt:
Terminal
poetry add ssb-parquedit- Opprett en klient og se data:
Notebook
from ssb_parquedit import ParquEdit
con = ParquEdit()
con.view(table_name="manuell_tabell", limit=5)- Oppdater en rad med begrunnelse:
Notebook
row = con.view(table_name="manuell_tabell", where="enhet_id = '12345'")
rowid = row["rowid"].iloc[0]
con.edit(
table_name="manuell_tabell",
rowid=rowid,
changes={"status": "GODKJENT"},
change_event_reason="REVIEW",
change_comment="Manuell kvalitetssikring",
)Bruksområde
Parquedit er ment som et midlertidig lagringsformat under arbeidsprosessen for manuell editering. Tjenesten forutsetter at brukeren ønsker å oppdatere en og en rad etter manuelle vurderinger av en person, og at dette skjer etter maskinelle kontroller og rettinger er gjennomført. Tjenesten forutsetter også at oppdateringer skjer i en enkelttabell. Parquedit har ikke støtte for primary eller foreign nøkler.
Når arbeidsprosessen med manuell editering er gjennomført og data lagres i stabile datatilstander, så forutsetter systemet at teamet som eier dataene selv henter ut opplysninger fra Parquedit med logger som skal benyttes til kvalitetsrapporter og gi evnen til å gjenskape manuelle editeringer på et senere tidspunkt.
Forberedelser
For at et team skal kunne benytte seg av Parquedit må Teamansvarlig først aktivere tilgang i Dapla Ctrl. Det gjøres på følgende måte:
- Gå inn i Dapla Ctrl
- Åpne Instillinger på Teamsiden
- Under Parquedit velger du Aktiver tilgang
Etter dette kan teamets medlemmer opprette så mange Parquedit-tabeller de ønsker.
Et team som har aktivert tilgangen kan åpne en tjeneste i Dapla Lab og installere Python-pakken ssb-parquedit i et ssb-project på følgende måte:
Terminal
poetry add ssb-parqueditFunksjonalitet
Under beskrives funksjonaliteten som tilbys av Parquedit. Vanlig funksjonalitet tilbys som funksjoner i Python-biblioteket ssb-parquedit.
Opprette kobling
For å jobbe med Parquedit-tabeller må man første opprette en kobling. Opprett en standardkobling på følgende måte:
Notebook
from ssb_parquedit import ParquEdit
con = ParquEdit()Avanserte brukere kan også konfigurere sin egen kobling til Parquedit. Det beskrives nærmere senere.
Opprette ny tabell
Man kan opprette en ny Parquedit-tabell basert på følgende input:
- Parquet-fil
- Dataframe i minnet (Pandas, Polars, etc.)
- json-skjema
Notebook
# Opprett fra eksisterende Parquet-fil i GCS (skjema utledes fra filen)
con.create_table(
table_name="manuell_tabell_gcs",
source="gs://my-bucket/path/to/file.parquet",
product_name="eksempelprodukt",
unique_key=["enhet_id", "aar"],
)Notebook
import pandas as pd
df = pd.DataFrame(
{
"enhet_id": ["A1", "A2"],
"aar": [2025, 2025],
"status": ["NY", "NY"],
}
)
con.create_table(
table_name="manuell_tabell",
source=df,
product_name="eksempelprodukt",
unique_key=["enhet_id", "aar"],
fill=True,
)Følgende argumenter må oppgis ved opprettelse av ny tabell:
table_name er det navnet på tabellen du ønsker å opprette. Siden et team kan ha flere tabeller, er det dette navnet som benyttes senere for å referere til tabellen.
source er kilden (Parquet, Dataframe eller json-skjema) som skal benyttes til å opprette tabellen.
product_name er obligatorisk og lagres som en kommentar på tabellen. Tabellnavn må være lowercase, starte med bokstav eller underscore, kun inneholde lowercase-bokstaver, tall og underscore, og være maks 20 tegn.
unique_key er en liste med kolonner som til sammen unikt identifiserer en rad, tilsvarende en primærnøkkel.
Partisjonert tabeller
Notebook
# Opprett partisjonert tabell og fyll med data
con.create_table(
table_name="manuell_tabell_partisjonert",
source=df,
product_name="eksempelprodukt",
part_columns=["aar"],
unique_key=["enhet_id"],
fill=True,
)Laste data
Notebook
con.insert_data(
table_name="manuell_tabell",
source=df,
)Lese data
Notebook
# Hent alle rader (pandas DataFrame)
df = con.view(table_name="manuell_tabell")
# Filter og velg kolonner
utvalg = con.view(
table_name="manuell_tabell",
where="aar = 2025",
columns=["enhet_id", "status", "verdi"],
order_by="enhet_id ASC",
)Notebook
# Alle rader (returnerer pandas DataFrame som standard)
result = con.view("manuell_tabell")
# Filtrering med WHERE-betingelse
result = con.view("manuell_tabell", where="aar = 2025")
result = con.view("manuell_tabell", where="enhet_id = 'A1' AND aar >= 2025")
# Velg spesifikke kolonner
result = con.view("manuell_tabell", columns=["enhet_id", "aar"])
# Sorter resultater
result = con.view("manuell_tabell", order_by="aar DESC")
# Returner som polars eller pyarrow
result = con.view("manuell_tabell", output_format="polars")
result = con.view("manuell_tabell", output_format="pyarrow")Editering
En vanlig flyt er:
- Finn riktig rad og les ut
rowid. - Kall
edit()med nye verdier for raden identifisert medrowid. - Oppgi årsak (
change_event_reason) og kommentar (change_comment).
Notebook
# 1) Finn raden som skal endres
rad = con.view(
table_name="manuell_tabell",
where="enhet_id = 'A1' AND aar = 2025",
)
rowid = rad["rowid"].iloc[0]
# 2) Oppdater verdier på raden
con.edit(
table_name="manuell_tabell",
rowid=rowid,
changes={"status": "KORRIGERT"},
change_event_reason="REVIEW",
change_comment="Endret etter intern kontroll",
)changes er en ordbok (dict) med par på formen {kolonnenavn: ny_verdi}.
Gyldige verdier for change_event_reason er:
OTHER_SOURCEREVIEWOWNERMARGINAL_UNITDUPLICATEOTHER
Lese logger
Bruk get_edits() for å hente historikk over manuelle endringer.
Notebook
# Endringer for en tabell
logg = con.get_edits(table_name="manuell_tabell")
# Alternativt alle tabeller
alle_endringer = con.get_edits()Dette gir blant annet:
- hvem som gjorde endringen
- tidspunkt for endringen
- begrunnelse og kommentar
- gamle og nye verdier
Liste tabeller
Liste ut alle tabeller som tilhører teamet:
Notebook
tabeller = con.list_tables()Antall rader i en tabell
Notebook
con.count(table_name="manuell_tabell")Sjekk av eksistens
Notebook
con.exists(table_name="manuell_tabell")Slette tabell
Gjør følgende for å fjerne tabellen fra den sentrale katalogen og slette filene i teamets bøtte:
Notebook
con.drop_table("manuell_tabell")Hvis man ønsker å beholde selve datafilene i produktbøtta, legger man til cleanup=False på denne måten:
Notebook
con.drop_table("manuell_tabell", cleanup=False)